使用glob查找其中包含相同编号的重复文件名

时间:2016-10-25 20:26:32

标签: python python-3.x glob

我目前正在编写一个循环遍历文件夹中所有文件的脚本,并根据命名约定重命名它们。

我想要实现的目标如下:如果脚本找到2个文件名中具有相同编号的文件(例如'101 test'和'101 real'),它会将这两个文件移动到名为'duplicates'的不同文件夹。

我最初的计划是使用glob循环遍历文件夹中的所有文件,并将包含特定号码的每个文件添加到列表中。然后检查列表的长度,如果长度超过1(即有2个文件具有相同的数字),则文件将位于该“duplicates”文件夹中。但由于某些原因,这不起作用。

这是我的代码,我希望有比我更多经验的人能给我一些有关如何实现目标的见解,谢谢!:

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")

1 个答案:

答案 0 :(得分:1)

一种简单的方法是在这样的结构中收集带有数字的文件名:

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

如果此dict中的列表长于1,则移动。

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