Вы определенно идете в правильном направлении.
Предполагая, что вы используете по крайней мере версию 3.5 Python, вы можете использовать glob.iglob()
для рекурсивной итерации по каждому файлу в каждом подкаталоге.
Я настроил ваш код, чтобы сделать его немного более pythoni c.
Некоторые изменения c:
Переименован в file_to_delete
set
до files_to_delete
, поскольку он содержит несколько файлов и должен быть во множественном числе.
Использовал оператор with
с объектом file 's менеджер контекста , чтобы не беспокоиться об исключениях и явно вызывать .close()
.
Зацикливание на fin
для получения каждой строки без явного вызова .readline()
.
Используется os.path.sep
вместо жесткого кодирования /
.
Удалены как ненужные вызовы os.chdir(path)
и os.path.exists(f)
.
Он работает путем перебора каждого файла в каждом подкаталоге (что дает нам полный путь к файлу как str
), затем мы перебираем t он files_to_delete
set
проверяет, является ли каждая file_to_delete
подстрокой filepath
. Если это так, удалите файл и break
из этого l oop для продолжения следующего пути к файлу.
Если вы знаете, что нет других имен файлов с аналогичной базой, вы можете раскомментировать эту строку : files_to_delete.remove(file_to_delete)
. Например, если у вас есть файл с именем:
/iles_20X_299 / Box20 / 660491-3 _mag20_xpos5980_ypos6279.jpg
, но не с другим именем :
/ tile_20X_299 / Box20 / 660491-3 _mag10_xpos2000_ypos4000.jpg
На всякий случай оставьте его закомментированным.
import glob, os
files_to_delete = set()
with open('files_to_delete.csv', 'r') as fin:
fin.readline() # Consume header
for line in fin:
line = line.strip()
if line:
files_to_delete.add('Box' + line.replace(',', os.path.sep)) # Assume none of the files contain a comma
print(files_to_delete)
for filepath in glob.iglob(r'/home/sshah/Tiles/tiles_20X_299/**/*', recursive=True):
for file_to_delete in files_to_delete:
if file_to_delete in filepath:
print('Delete:', filepath)
#os.remove(filepath)
#files_to_delete.remove(file_to_delete)
break