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でそれを実装するにはどうすればよいですか? ありがとう。

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.txtなり0023.pyますか? 同じファイルか別のファイルか? OSにとっては別のファイルなので、拡張子はそのままにしています。それが目的の出力である場合は、簡単に削除できます。

于 2012-05-03T05:11:53.720 に答える
0

これはまさにあなたが求めていたものではありませんが、コードを 1 行も書かなくても機能する可能性がありますが、パフォーマンスが少し低下します。おまけとして、同じ内容でファイル名が異なるファイルをグループ化します。

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

最新バージョンはほとんど常に O(n) であり、精度を少しでも犠牲にすることはありません。

于 2012-05-03T05:15:50.437 に答える
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 に答える