【问题标题】:Python script to move matching images to separate folder将匹配图像移动到单独文件夹的 Python 脚本
【发布时间】:2018-02-02 05:57:15
【问题描述】:

我使用 glob (https://docs.python.org/2/library/glob.html) 制作了一个 python 脚本,该脚本将 JPG 图像与其匹配的 XML 注释匹配并将其移动到不同的文件夹(例如,我有 1.jpg、2.jpg、3.jpg、1 .xml, 3.xml) 然后它移动 (1.jpg,1.xml 和 3.jpg,3.xml) 到一个新文件夹。 2.jpg 没有移动,因为没有与此图像匹配的 xml

import os
import glob
import os.path
import shutil

path = os.getcwd()
j=0


os.chdir("path\\to\\folder\\")   
os.mkdir("image_with_xml")     # create a new folder
newpath =  "path\\to\\folder\\"+"image_with_xml" 

while j < len(glob.glob(path+"\\*"))-1:  
    a=glob.glob(path+"\\*")[j]

    b=glob.glob(path+"\\*")[j+1]


    print(a)
    a1 = os.path.splitext(a)[0]
    b1 = os.path.splitext(b)[0]


    if a1==b1:
        j=j+2
        shutil.move(a,newpath)   # move image to new path.
        shutil.move(b,newpath)   # move image to new path.
    else:
        j=j+1

上面的代码适用于移动一些,但不是所有的图像到新文件夹,为了移动剩余的图像,我必须在脚本中创建新文件夹,然后将剩余的图像移动到那里(例如:让我们说我有 100 个 jpg 和 100 个匹配的 XML,然后我第一次运行这个脚本时只有 62 个被移动到新文件夹,第二次我用不同的文件夹名称运行脚本,剩下的 38 个被移动到下一个文件夹)。如何修改脚本,以便将所有匹配 XML 的图像移至一个文件夹?

【问题讨论】:

  • 看起来你在期待例如4.jpg4.xml 在 glob 结果列表中彼此相邻,但事实并非如此。
  • 另外,这段代码效率极低。您在 while 循环条件中调用了一次 glob.glob(),但随后您再次调用它,两次!,每次都通过循环!
  • 我在这里使用 (if a1==b1) 我假设 xml 和 jpg 彼此相邻(如 4.jpg、4.xml、5.jpg、6.jpg、6.jpg、4.xml、5.jpg、6.jpg、6.jpg xml,其中 4 个彼此相邻),但是,如果它们彼此不靠近,我有(否则 j=J+1),其中它会跳过一个图像(因此在上面的示例中,它将跳过 5 个但需要 6 个)跨度>
  • 但结果可能是4.xml,6.jpg,5.xml,4.jpg,6.xml,5.jpg,在这种情况下,没有一个匹配的数字是相邻的。 glob()的结果没有排序
  • 调用glob.glob()一次,将结果保存在列表中,对列表进行排序,然后循环遍历该列表,而不是一遍又一遍地调用 glob。

标签: python python-3.x pattern-matching glob


【解决方案1】:

这个应该能胜任。我创建了两个列表,一个是 xml,一个是 jpg。然后我检查两个列表中是否存在文件名。如果是:移动!

为了便于阅读,我添加了一个新函数来创建列表。

import os
import glob
import shutil

def remove_ext(list_of_pathnames):
    """
    removes the extension from each filename
    """
    return [os.path.splitext(filename)[0] for filename in list_of_pathnames]

path = os.getcwd()
os.chdir("path\\to\\folder\\")   
os.mkdir("image_with_xml")     # create a new folder
newpath = os.path.join("path\\to\\folder\\","image_with_xml") # made it os independent... 

list_of_jpgs = glob.glob(path+"\\*.jpg")
list_of_xmls = glob.glob(path+"\\*.xml")

print(list_of_jpgs, "\n\n", list_of_xmls) #remove

jpgs_without_extension = remove_ext(list_of_jpgs)
xmls_without_extension = remove_ext(list_of_xmls)

print(jpgs_without_extension, "\n\n", xmls_without_extension) #remove

for filename in jpgs_without_extension:
    if filename in xmls_without_extension:
        print("moving", filename) #remove
        shutil.move(filename + '.jpg'), newpath)   # move image to new path.
        shutil.move(filename + '.xml'), newpath)   # move image to new path.

【讨论】:

  • 它显示以下错误,请注意我在此位置有 Structure1-(1)jpg 文件与匹配的 xml 文件“C:\Users\Anaconda3\lib\shutil.py”,第 120 行, 在带有 open(src, 'rb') as fsrc 的副本文件中: FileNotFoundError: [Errno 2] 没有这样的文件或目录:'C:\\Users\\Ajinkya Bobade\\Desktop\\Structure2\\Structure1-(1) \\jpg'
  • 用于移动文件的文件名创建已损坏 - 现在应该修复。
  • 它正常工作到这里 """print(jpgs_without_extension, "\n\n", xmls_without_extension) #remove""" 即它正确地列出了所有 xml 和所有 jps 没有扩展,但是是shutil。 move(filename + '.jpg'), newpath) # 将图像移动到新路径。 shutil.move(filename + '.xml'), newpath) # 将图像移动到新路径。在新文件夹中只移动一张图片
  • 成功了!!我拼错了 jpg 的正确扩展名
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 2020-04-15
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多