2016-10-25 1 views
0

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

То, что я хотел бы достичь, следующее: если скрипт находит 2 файла с одинаковым номером в имени файла (например, «101 test» и «101 real»), он переместит эти два файла в другую папку с именем «duplicates».

Мой первоначальный план состоял в том, чтобы использовать glob для перемещения по всем файлам в папке и добавления в список каждого файла, содержащего определенное число. Затем список будет проверяться по длине, и если длина превысит 1 (т. Е. Есть 2 файла с одинаковым номером), тогда файлы будут расположены в этой папке «дубликатов». Однако по какой-то причине это не работает.

Вот мой код, я надеялся, что кто-то с большим опытом, чем я могу дать мне некоторое представление о том, как достичь своей цели, благодаря !:

app = askdirectory(parent=root) 




for x in range(804): 
    listofnames = [] 
    real = os.path.join(app, '*{}*').format(x) 
    for name in glob.glob(real): 
     listofnames.append(name) 
     y = len(listofnames) 
     if y > 1: 
      for names in listofnames: 
       path = os.path.join(app, names) 
       shutil.move(path,app + "/Duplicates") 
+0

Один альтернативное предложение, чтобы с помощью списка, чтобы создать словарь, который отображает число на количество раз это происходит {номер : произошло время}. Затем вы можете просто искать время, имевшееся для значений, превышающих 1. – pomegranate

+0

Привет @pomegranate, спасибо за ответ, да, это звучит хорошо, я посмотрю, как это сделать. Однако, с точки зрения моего фактического метода, чтобы найти дубликаты в списке/словаре, как вы думаете, мой код должен работать? – Ruthus99

ответ

1

Простой способ собрать имена файлов с номерами в такой как:

numbers = { 
    101: ['101 test', '101 real'], 
    93: ['hugo, 93'] 
} 

и если список в этом дикторе длиннее, чем один, перемещение.

import re, os 
from collections import defaultdict 

app = askdirectory(parent=root) 
# a magic dict 
numbers = defaultdict(list) 

# list all files in this dir 
for filename in os.listdir(app): 
    # \d+ means a decimal number of any length 
    match = re.search('\d+', filename) 

    if match is None: 
     # no digits found 
     continue 

    #extract the number 
    number = int(match.group()) 

    # defaultdict magic 
    numbers[number].append(filename) 

for number, filenames in numbers.items(): 
    if len(filenames) < 2: 
     # not a dupe 
     continue 
    for filename in filenames: 
     shutil.move(os.path.join(app, filename), 
        os.path.join(app, "Duplicates")) 

defaultdict магия просто короткая рука для следующего кода:

if number not in numbers: 
     numbers.append(list()) 
    numbers[number] = filename 
+0

Привет @robyschek, спасибо за ответ, который очень ценится! Я не слишком хорошо знаком с python, поэтому я не совсем понимаю, что вы имеете в виду, когда говорите, что «defaultdict» - это просто сокращение, как это реализовать в моем скрипте? мне нужно определить его как отдельную функцию? Благодаря! – Ruthus99

+0

@ Ruthus99 'defaultdict' уже реализован в модуле' collections' и импортируется оттуда в заголовок моего первого фрагмента. Я мог бы использовать простой dict: 'numbers = {}' и код из второго фрагмента. Например, одна магическая линия заменяет три линии. Я добавил второй фрагмент, чтобы уточнить, что делает эта линия. defaultdict уже реализован в модуле 'collections' и импортируется оттуда в заголовке первого фрагмента. Вы также можете использовать простой dict: 'numbers = {}' и код из второго фрагмента. Например, одна магическая линия заменена тремя линиями. – robyschek

+0

Привет @robyschek, хорошо, что имеет смысл, я не видел импорт наверху, спасибо за вашу помощь! – Ruthus99

Смежные вопросы