2016-01-25 42 views
0

我在一个目录中有一个巨大的图像列表和另一个相应的注释列表(.txt文件)。
我需要在匹配图像注释之后的每个图像上执行一项操作,并将其保存到另一个目录中。有没有一种优雅的方式,每一步都不要三次?
也许使用cPickle或用于快速文件管理的任何库?如何从一个目录快速切换到另一个目录Python

import glob 
from PIL import Image 

os.chdir('path_images') 
list_im=glob.glob('*.jpg') 
list_im.sort() 
list_im=path_images+list_im 
os.chdir('path_txt') 
list_annot=glob.glob('*.txt') 
list_annot.sort() 
list_annot=path_txt+list_im 

for i in range(0,len(list_images)): 

乔尔指出,OS操作不是强制性的,如果您在名称中包含路径

#os.chdir('path_images') 
    im=Image.open(list_im[i]) 
    #os.chdir('path_text') 
    action_on_image(im,list_annot[i]) 
    #os.chdir('path_to_save_image') 
    im.save(path_to_save+nom_image) 

我在Python真正的初学者,但我相信,我的代码是超级低效可以改进。

+2

你可能已经错过了'paths'不仅可以包含的文件名前缀,但也是路径itseft ;-)看看'os.path.join()' –

+0

好吧,如果我只是直接修改list_im和list_annot来包含整个路径,我不必使用chdir就是你在说什么? – jean

+0

我会修改我的代码,并等待更快的实现,但感谢您的回答! – jean

回答

2

不要必须chdir(和FWIW你真的不想依赖于当前的工作目录)。在你的代码中使用绝对路径,你会没事的。

import os 
import glob 
from PIL import Image 

abs_images_path = <absolute path to your images directory here> 
abs_txt_path = <absolute path to your txt directory here> 
abs_dest_path = <absolute path to where you want to save your images> 

list_im=sorted(glob.glob(os.path.join(abs_images_path, '*.jpg'))) 
list_annot=sorted(glob.glob(os.path.join(abs_txt_path, '*.txt'))) 

for im_path, txt_path in zip(list_im, list_annot): 
    im = Image.open(im_path) 
    action_on_image(im, txt_path) 
    im.save(os.path.join(abs_dest_path, nom_image)) 

需要注意的是,如果你的路径是相对于安装脚本在那里,你可以得到脚本的目录路径与os.path.dirname(os.path.abspath(__file__))

+0

感谢这个答案干净和精确! – jean

+1

我同意:避免使用'os.chdir()',因为这不是您可以在代码中依赖的东西,并且可能会破坏其他严重编码的软件。 –

相关问题