Удаление файлов из каталога с помощью файла CSV в python - PullRequest
0 голосов
/ 17 марта 2020

Я хочу удалить файлы из нескольких папок, используя файл .csv. Файл csv содержит список имен файлов, которые необходимо удалить (пример: Box4, 60012-01). Как данные хранятся в нескольких папках и также имеют дополнительное расширение (пример: /tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg. Есть ли способ удалить эти файлы. Помощь будет очень признателен. Это то, что я до сейчас, но не уверен, что я иду в правильном направлении. [образец файла CSV для удаления] [1]

fin = open('files_to_delete.csv', 'r')
fin.readline()
print(fin)
file_to_delete = set()
while True:
    line = fin.readline().strip()
    #print(line)
    if not line:
        break
    array = line.split(',')
    file_to_delete.add("Box" + array[0] + "/" + array[1])
fin.close()
print(file_to_delete)
#
for path in glob.glob('/home/sshah/Tiles/tiles_20X_299/*'):
    for f in file_to_delete:
        print(f)
        os.chdir(path)
        #print(path)
        if os.path.exists(f):
            print('delete')
            #os.remove(f)```


  [1]: https://i.stack.imgur.com/dFCxk.png

1 Ответ

0 голосов
/ 24 марта 2020

Вы определенно идете в правильном направлении.

Предполагая, что вы используете по крайней мере версию 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
...