Python 扫描重复的文件名
想象几个文件夹,例如Python 扫描重复的文件名,python,Python,想象几个文件夹,例如 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.tx
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中实现它?谢谢。步骤1:使用glob.glob查找所有文件 步骤2:使用每个文件名的最后一部分(在最后一个分隔符之后)创建一个字典
步骤3:浏览文件路径列表并查找所有重复的文件。步骤1:使用glob.glob查找所有文件
import os
import collections
path = "d:\myfolder"
filelist = []
for (path, dirs, files) in os.walk(path):
filelist.extend(files)
filecount = collections.Counter(filelist)
步骤2:使用每个文件名的最后一部分(在最后一个分隔符之后)创建一个字典
第3步:浏览文件路径列表,找到所有重复的文件路径。没有经过广泛测试,但这是可行的:
import os
import collections
path = "d:\myfolder"
filelist = []
for (path, dirs, files) in os.walk(path):
filelist.extend(files)
filecount = collections.Counter(filelist)
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])
其工作方式如下:
基本名称:[文件路径]
在列表目录中创建条目(或附加现有列表)os.walk
之后,您将有一个这样的dict:
{0023.txt: ['d:\myfolder\abc', 'd:\myfolder\kjes'], 0025.txt: ['d:\myfolder\abc']}
因此,要获得输出,只需迭代排序的dict并计算列表中的条目。您可以将其输出重定向到一个文件,也可以直接在Python中打开输出文件
您可以使用扩展名--
0023
vs0023.txt
显示输出。如果您有0023.txt
和0023.py
,会发生什么?相同的文件还是不同的?对于操作系统来说,它们是不同的文件,所以我保留了扩展名。如果这是您想要的输出,它很容易剥离 未进行广泛测试,但这是有效的:
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])
其工作方式如下:
基本名称:[文件路径]
在列表目录中创建条目(或附加现有列表)os.walk
之后,您将有一个这样的dict:
{0023.txt: ['d:\myfolder\abc', 'd:\myfolder\kjes'], 0025.txt: ['d:\myfolder\abc']}
因此,要获得输出,只需迭代排序的dict并计算列表中的条目。您可以将其输出重定向到一个文件,也可以直接在Python中打开输出文件
您可以使用扩展名--
0023
vs0023.txt
显示输出。如果您有0023.txt
和0023.py
,会发生什么?相同的文件还是不同的?对于操作系统来说,它们是不同的文件,所以我保留了扩展名。如果这是您想要的输出,它很容易剥离 这并不完全是您所要求的,但是它可能不需要编写一行代码就可以为您工作,尽管性能会受到一定的影响。作为奖励,它将具有相同内容但不同文件名的文件组合在一起:
最新版本几乎总是O(n),而不会牺牲一点点的准确性。这并不是您所要求的,但它可能在不编写代码的情况下对您有效,尽管性能会有一点损失。作为奖励,它将具有相同内容但不同文件名的文件组合在一起:
最新版本几乎总是O(n),而不会牺牲一点准确性。您正在查找同名文件。您正在查找同名文件。此解决方案非常好,但语法不正确:
filelist.append[files]
不运行,无论如何,您可能希望extend
而不是append
(并且您还应该捕获集合的返回值。Counter(filelist)
,否则这是一个无意义的操作)。它应该是filelist.extend(files)
此解决方案非常好,但语法不正确:filelist.append[files]
不运行,而且无论如何,您可能希望扩展
而不是附加
(并且您应该捕获集合的返回值。计数器(文件列表)
,否则这是一个无意义的操作)。它应该是文件列表。扩展(文件)