我目前正在编写一个循环遍历文件夹中所有文件的脚本,并根据命名约定重命名它们。
我想要实现的目标如下:如果脚本找到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")
答案 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