#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. Еще раз спасибо и очень ценю вашу помощь