2016-01-25 2 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.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()', поскольку это не то, на что вы можете положиться в своем коде, и может нарушить другое, плохо кодированное программное обеспечение. –

Смежные вопросы