【发布时间】: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.jpg和4.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