Нужна помощь в удалении определенного расширения файла из папки - PullRequest
0 голосов
/ 30 января 2019

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

т.е.Я хочу, чтобы mytext.txt удалялся, только если mytext.txt и mytext.docx присутствуют в одной и той же папке, если присутствует только mytext.txt, тогда я хочу, чтобы код пропустил эту конкретную папку.

Я добавил следующие строки для удаления файлов с расширением независимо от условия:

for item in test:
    if item.endswith('.txt'):
        os.remove(os.path.join(pathforRemove, item))

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Вы можете слегка изменить свой ответ, чтобы проверить, существует ли это условие, сохранив его в dict с каждым значением как list.Затем мы собираем все значения из словаря, которые имеют длину больше двух и имеют файлы, заканчивающиеся на '.txt'.Как только мы получим все эти значения, мы удалим их.

from collections import defaultdict

recs = defaultdict(list)

for item in test:
    name = os.path.basename(item)
    no_ext = name.split('.')[0]
    recs[no_ext].append(name)

to_delete = [val for v in recs.values() for val in v if len(v) >= 2 and val.endswith('.txt')]

for item in to_delete:
    os.remove(os.path.join(pathforRemove, item))
0 голосов
/ 30 января 2019

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

import os
rootDir = '/test-dir-traverse'
extensionToBeRetained = 'docx'
extensionToBeRemoved = 'txt'
for dirName, subdirList, fileList in os.walk(rootDir):
    print('Found directory: %s' % dirName)
    for fnameToBeRemoved in fileList:
        print('\t%s' % fnameToBeRemoved)
        for fname in fileList:
            if fnameToBeRemoved.endswith(extensionToBeRemoved) and fname.endswith(extensionToBeRetained) and fnameToBeRemoved[0:-len(extensionToBeRemoved)] == fname[0:-len(extensionToBeRetained)]:
                print('Deleting file : {}').format(fnameToBeRemoved)

Вы можете настроить расширения файлов и изменить их дальше.

0 голосов
/ 30 января 2019

Если 'f1.txt', 'f2.png', 'f2.txt', 'f3.png', 'f4.txt' ваши файлы:

from collections import defaultdict
test = ['f1.txt', 'f2.png', 'f2.txt', 'f3.png', 'f4.txt']

# construct a filename to extensions map
fname_to_ext = defaultdict(set)
pairs = list(map(lambda s: (s[:s.rfind('.')], s[s.rfind('.'):]), test))
for fname, ext in pairs:
    fname_to_ext[fname].add(ext)

for fname, exts in fname_to_ext.items():
    if len(exts) > 1 and '.txt' in exts:
        print('deleting: ', fname + '.txt')
        # os.remove(os.path.join(pathforRemove, item))  

Это печатает:

deleting:  f2.txt
...