Как я могу обрабатывать изображения из вложенных каталогов и сохранять их в соответствующих каталогах в python? - PullRequest
0 голосов
/ 19 февраля 2020

Я пытался изменить размеры всех изображений, содержащихся во вложенных каталогах, и сохранить полученное изображение в каталогах с такой же структурой, что и исходный. Я продолжаю получать сообщение об ошибке, что каталог или файл не существует (хотя он действительно существует).

root_path= 'D:/Users/mbeng/OneDrive/Desktop/mass_buildings'
def locate(pattern, root_path):
    for path, dirs, files in os.walk(os.path.abspath(root_path)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename)

path = [f for f in locate('*.tiff', root_path)]

for file in path:
    i = Image.open(file)

    #fname = file[file.find('mass_buildings\\'):]
    fname = file.replace('D:\\Users\\mbeng\\OneDrive\\Desktop\\mass_buildings', 'D:\\Users\\mbeng\\OneDrive\\Desktop\\resized2')
    #fname = fname.replace('\\', '_')

    fn, fext = os.path.splitext(fname)
    #print(file)
    img = i.resize((300, 300))
    #print(img)
    img.save('{}.tiff'.format(fn), 'TIFF')

, когда я запускаю приведенный выше код, я получаю сообщение об ошибке:

D:\Users\mbeng\Python\PyTorch\python.exe D:/Users/mbeng/Python/FeatureExtract/fils_list.py
Traceback (most recent call last):
  File "D:/Users/mbeng/Python/FeatureExtract/fils_list.py", line 68, in <module>
    img.save('{}.tiff'.format(fn), 'TIFF')
  File "D:\Users\mbeng\Python\PyTorch\lib\site-packages\PIL\Image.py", line 2085, in save
    fp = builtins.open(filename, "w+b")
FileNotFoundError: [Errno 2] No such file or directory: 'D:\\Users\\mbeng\\OneDrive\\Desktop\\resized2\\test\\map\\22828930_15.tiff'

Process finished with exit code 1

reized2 - это каталог, который я создал для сохранения обработанных файлов. Он содержит каталоги: train, test и valid, каждый из которых содержит два подкаталога: sat и map. Каталог исходных файлов (mass_buildings) имеет ту же структуру, что и resized2. Как я могу заставить это работать?

1 Ответ

0 голосов
/ 24 февраля 2020

Я выяснил пару вещей, которые заставляли код не работать.

  1. метод replace() не работал, поэтому я изменил пути к необработанным строкам и заменил // на \.

  2. Мне пришлось удалить предварительно созданный каталог для сохранения обработанных файлов, чтобы они создавались во время выполнения с использованием Pathlib.Path().mkdir().

root_path= 'D:/Users/mbeng/OneDrive/Desktop/mass_buildings'
def locate(pattern, root_path):
    for path, dirs, files in os.walk(os.path.abspath(root_path)):
        for filename in fnmatch.filter(files, pattern):
            yield os.path.join(path, filename)

path = [f for f in locate('*.tiff', root_path)]

for file in path:
    fname = file.replace(r'D:\Users\mbeng\OneDrive\Desktop\mass_buildings', r'D:\\Users\\mbeng\\OneDrive\\Desktop\\resized')
    fp = os.path.split(fname)[:-1][0]
    base = os.path.basename(fname)
    Path(fp).mkdir(parents=True, exist_ok=True)
    fn, fext = os.path.splitext(base)

    i = Image.open(file)
    img = i.resize((700, 700), PIL.Image.NEAREST)
    img.save(os.path.join(fp, '{}.tiff'.format(fn)))
...