如果文件名包含相同的关键字且文件大小大致相同,则返回文件名

时间:2017-12-05 05:23:51

标签: python regex list-comprehension

已经在这个问题上花了相当多的时间,我觉得它应该是相对简单的,但我想以计算效率和Pythonic的方式实现这一点。

我创建了两个列表:一个包含与每个文件名关联的关键字,另一个包含四舍五入到最接近的25个字节的相应文件的文件大小。我试图以相当基本的方式识别重复文件,文件本身可能存在一些非常小的差异(就文本而言),但一般来说,简单的文件大小比较应该可以解决问题。

到目前为止,我的方法是遍历文件名,关键字和文件大小,并返回包含不止一次重复的关键字和大小的文件名。请注意,我下面的当前实现并不要求重复的大小必然与该特定关键字相关联(但这是我想要的:文件重复应该具有大致相同的文件大小和绝对相同的关键字)。我想我只是在思考这个问题,但是在这里使用字典会有用吗?

一些示例文件名包括:

United States vs Mexico on 4142017.txt w/ file size of 5282 bytes
Mexico vs Uruguay on 3272016.txt w/ file size of 5684 bytes
Spain vs France on 4222017.txt w/ file size of 4883 bytes
United States vs Mexico on 4152017.txt w/ file size of 5276 bytes

这是我到目前为止所做的事情(我意识到这不起作用):

import os, re

path = 'Enter path here'; os.chdir(path)
folders = os.listdir(path)

for folder in folders[:3]:

    files = os.listdir(path + '\\' + folder); os.chdir(path + '\\' + folder)

    names = [re.findall(r'vs (.*) on', f)[0] for f in files]
    sizes = [os.stat(f).st_size for f in files]
    sizes = [int(25*round(float(s)/25)) for s in sizes]

    duplicates = [f for f, i, j in zip(files, names, sizes) if names.count(i)>1 and sizes.count(j)>1]

    print(duplicates)

所需的输出将是如下列表:

['United States vs Mexico on 4142017.txt','United States vs Mexico on 4152017.txt']

1 个答案:

答案 0 :(得分:1)

我认为执行此类操作的规范方法是使用defaultdict,形成一个字典,其中键是关键字和大小的元组,值是匹配文件名的列表。

模拟示例:

from collections import defaultdict

# input data as a list or sequence of tuples (keyword, size, filename):
entries = [('foo',3,'foo a'), ('bar',6,'bar b'), ('foo',3,'foo c')]

d = defaultdict(list)
for (k,v,f) in entries:
    d[(k,v)].append(f)

print [dupe for dupes in d.values() if len(dupes)>1 for dupe in dupes]

对应于具有更多重复关键字大小对的条目的文件名是字典中长度大于1的条目。

要遍历重复项而不是显式创建列表,可以使用itertools.chain.from_iterable

这不是最节省内存的方法 - 通过在构建字典时检查字典,可以避免存储所有匹配的文件名 - 但它具有简单的好处