2012-05-03 6 views
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 

などのファイルがあり、3つの0023.txtファイル、および2つの2763.txtファイルがあります。

私は、次の情報が含まれているファイル(たとえば、d:\myfolder\dup.txt)作成したい:

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

どのように私はPythonでそれを実装することができますか?ありがとう。

+0

同じ名前のファイルを探しています。 –

答えて

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']} 

だからあなたの出力を取得するには、単にソートされた辞書を反復処理し、リスト内のエントリを数えます。これの出力をファイルにリダイレクトするか、出力ファイルをPythonで直接開くことができます。

出力は、拡張子を取り除いて表示します。00230023.txtです。 0023.txt0023.pyの場合はどうなりますか?同じファイルですか、違うのですか? OSには異なるファイルなので、私は拡張子を守った。もしそれがあなたの望む出力であれば、それは簡単に取り除かれます。

0

ステップ1:すべてのファイルを検索しglob.globを使用 ステップ2:(最後の分周後)各ファイル名の最後の部分で辞書を作成 ステップ3:ファイルパスのリストを通過し、すべての重複を見つけます。

0
import os 
import collections 
path = "d:\myfolder" 
filelist = [] 
for (path, dirs, files) in os.walk(path): 

    filelist.extend(files) 
filecount = collections.Counter(filelist) 
+1

この解決策は非常にいいですが、構文が間違っています: 'filelist.append [files]'は実行されません。とにかく 'append'ではなく' extend'を必要とするでしょう。 collections.Counter(filelist) 'それ以外の場合は無意味な操作です)。 – huon

+0

@dbaupp提案のためにtouに感謝 – shiva

+2

それは 'filelistでなければなりません。ファイルを拡張する ' –

0

これはあなたが求めているものではありませんが、パフォーマンスのペナルティは少しありますが、コード行を書かずにうまくいくかもしれません。ボーナスとして、それは一緒にグループに同じ内容が異なるファイル名を持つファイルます:

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

を最新バージョンには、精度のさえ少し犠牲にすることなく、ほとんど常にO(n)があります。