1

想象几个文件夹,例如

d:\myfolder\abc
d:\myfolder\ard 
d:\myfolder\kjes
...

并且在每个文件夹中,都有诸如

0023.txt, 0025.txt, 9932.txt in d:\myfolder\abc
2763.txt, 1872.txt, 0023.txt, 7623.txt in d:\myfolder\ard
2763.txt, 2873.txt, 0023.txt in d:\myfolder\kjes

所以,有三个0023.txt文件,两个2763.txt文件。

我想创建一个d:\myfolder\dup.txt包含以下信息的文件(例如 ):

0023 3
0025 1
9932 1
2763 2
1872 1
7623 1
2873 1

如何在 Python 中实现它?谢谢。

4

4 回答 4

1

没有经过广泛测试,但这有效:

import os, os.path

dupnames={}
for root, dirs, files in os.walk('myfolder'):
    for file in files:
        fulpath=os.path.join(root,file)
        if file in dupnames:
            dupnames[file].append(fulpath)
        else:
            dupnames[file]=[fulpath]

for name in sorted(dupnames):
    print name, len(dupnames[name])

这通过以下方式工作:

  1. 创建一个空字典;
  2. 遍历文件层次结构;
  3. 在列表的字典中创建一个条目(或附加现有列表),带有base name: [path to file].

之后os.walk你会有一个这样的字典:

{0023.txt: ['d:\myfolder\abc', 'd:\myfolder\kjes'], 0025.txt: ['d:\myfolder\abc']}

因此,要获得输出,只需遍历排序的 dict 并计算列表中的条目。您可以将其输出重定向到文件或直接在 Python 中打开输出文件。

您显示带有扩展名的输出 - 0023vs 0023.txt。如果你有0023.txtand会发生什么0023.py?相同的文件还是不同的文件?对于操作系统来说,它们是不同的文件,所以我保留了扩展名。如果这是您想要的输出,它很容易被剥离。

于 2012-05-03T05:11:53.720 回答
0

第 1 步:使用 glob.glob 查找所有文件 第 2 步:使用每个文件名的最后部分(在最后一个分隔符之后)创建一个字典 第 3 步:浏览文件路径列表并查找所有重复项。

于 2012-05-03T04:32:06.697 回答
0
import os
import collections
path = "d:\myfolder"
filelist = []
for (path, dirs, files) in os.walk(path):

    filelist.extend(files)
filecount = collections.Counter(filelist)
于 2012-05-03T04:39:14.230 回答
0

这并不完全是您所要求的,但它可能对您有用,而无需编写一行代码,尽管会降低性能。作为奖励,它将具有相同内容但文件名不同的文件组合在一起:

http://stromberg.dnsalias.org/~strombrg/equivalence-classes.html

最新版本几乎总是 O(n),丝毫不牺牲准确性。

于 2012-05-03T05:15:50.437 回答