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])
其工作方式如下:

  • 创建一个空的dict
  • 遍历文件层次结构
  • 使用
    基本名称:[文件路径]
    在列表目录中创建条目(或附加现有列表)
  • os.walk
    之后,您将有一个这样的dict:

    {0023.txt: ['d:\myfolder\abc', 'd:\myfolder\kjes'], 0025.txt: ['d:\myfolder\abc']}
    
    因此,要获得输出,只需迭代排序的dict并计算列表中的条目。您可以将其输出重定向到一个文件,也可以直接在Python中打开输出文件


    您可以使用扩展名--
    0023
    vs
    0023.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])
    
    其工作方式如下:

  • 创建一个空的dict
  • 遍历文件层次结构
  • 使用
    基本名称:[文件路径]
    在列表目录中创建条目(或附加现有列表)
  • os.walk
    之后,您将有一个这样的dict:

    {0023.txt: ['d:\myfolder\abc', 'd:\myfolder\kjes'], 0025.txt: ['d:\myfolder\abc']}
    
    因此,要获得输出,只需迭代排序的dict并计算列表中的条目。您可以将其输出重定向到一个文件,也可以直接在Python中打开输出文件


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

    这并不完全是您所要求的,但是它可能不需要编写一行代码就可以为您工作,尽管性能会受到一定的影响。作为奖励,它将具有相同内容但不同文件名的文件组合在一起:


    最新版本几乎总是O(n),而不会牺牲一点点的准确性。

    这并不是您所要求的,但它可能在不编写代码的情况下对您有效,尽管性能会有一点损失。作为奖励,它将具有相同内容但不同文件名的文件组合在一起:


    最新版本几乎总是O(n),而不会牺牲一点准确性。

    您正在查找同名文件。您正在查找同名文件。此解决方案非常好,但语法不正确:
    filelist.append[files]
    不运行,无论如何,您可能希望
    extend
    而不是
    append
    (并且您还应该捕获
    集合的返回值。Counter(filelist)
    ,否则这是一个无意义的操作)。它应该是
    filelist.extend(files)
    此解决方案非常好,但语法不正确:
    filelist.append[files]
    不运行,而且无论如何,您可能希望
    扩展
    而不是
    附加
    (并且您应该捕获
    集合的返回值。计数器(文件列表)
    ,否则这是一个无意义的操作)。它应该是
    文件列表。扩展(文件)