Как скопировать изображение в папку, используя его имя из файла

#python #python-3.x #directory

Вопрос:

я пытаюсь скопировать изображения из папки в другую, которые имеют то же имя, что и в файле

 dst="t" path = 'train'  f = open("file_txt.txt",'r') files = os.listdir(path) for i in files :  if i.endswith('.jpg'):  j=i.rsplit('.', 1)[0]  #print(j)  lines = f.readlines()  for line in lines:  #print(line)  if line == j:  #print(line)  shutil.copy(path '/' line.strip(), dst)  

j содержит такие

 COCO_train2014_000000110431 COCO_train2014_000000110437 COCO_train2014_000000110439  

строка содержит такие

 COCO_train2014_000000206463  COCO_train2014_000000206465  COCO_train2014_000000206467  

но новая папка пуста, и я попытался распечатать(строку), которая существует в условии if, но ничего не получил, в то время как file_txt содержит имя изображений, а train-это папка, содержащая сами изображения

Комментарии:

1. вы могли прочитать lines только один раз — перед всем for циклом. Вы также должны помнить, что он может содержать строки с n в конце, поэтому вам может потребоваться использовать line.strip() . И если у вас есть пустые строки, то вы можете пропустить их и запускать только тогда, когда if line: ...

2. сначала вы могли бы использовать print() , чтобы увидеть, что у вас действительно есть в переменных и какая часть кода выполняется — она называется "print debuging"

3. возможно, получить имена файлов из файла, создать /full/path/to/image.jpg и позже использовать os.path.exists(...) , чтобы проверить, существует ли он, а затем скопировать его. Таким образом, вам не нужны listdir() и не нужны вложенные for циклы.

4. если бы вы читали файл так, как f = open(...).read().split("n") тогда, вы получили бы имена без n' , и вы могли бы проверить его if j in f: без for line in lines: if line == j:

5. ваша проблема с разумом может заключаться в том, что вы пытаетесь копировать COCO_train2014_000000110431 без .jpg , но вы должны копировать COCO_train2014_000000110431.jpg

Ответ №1:

У вас беспорядок в коде, но я думаю, что ваша проблема в том, что вы пытаетесь скопировать COCO_train2014_000000110431 без .jpg , но вам нужно скопировать COCO_train2014_000000110431.jpg

Другая проблема может заключаться в следующем: вы сравниваете line перед использованием .strip() , так что это может произойти n в конце. Так что вы сравниваете if namelt;entergt; == name . Если вы запустите print(line) , то имя может выглядеть нормально (потому n что не видно), но если вы добавите несколько символов print(f"gt;gt;gt;{line}lt;lt;lt;") , то, возможно, вы увидите, что lt;lt;lt; это в новой строке.


Но я бы сделал это по — другому- без listdir() , но с os.path.exists()

 import os import shutil  src = 'train' dst = 't'  os.makedirs(dst, exist_ok=True) # create destination folder if not exists  filenames = open("file_txt.txt").read().split('n')  for name in filenames:  if name: # to skip empty lines  fullpath = os.path.join(src, name   '.jpg')  if os.path.exists(fullpath):  print('coping:', fullpath)  shutil.copy(fullpath, dst)  else:  print('SKIPING:', fullpath)  

Комментарии:

1. Еще раз спасибо и очень ценю вашу помощь