2016-01-25 40 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()',因爲這不是您可以在代碼中依賴的東西,並且可能會破壞其他嚴重編碼的軟件。 –

相關問題