2

いくつかのファイルをダウンロードしてフォルダに保存したいのですが、ファイル名が重複している可能性があるので、これを避けたいと思います。自動命名システムが必要だと思いますが、どうやって作るのかわかりません。私は自分の関数を使っshutilurllib2書きました。

これは私のコードの一部です:

path = 'C:/DL/Others/'+filename+file_ext
with open(path, 'wb') as fp:
    shutil.copyfileobj(req, fp)

ご存知のように、ファイルが存在するかどうかは。で確認できますos.path.exists('path')。ファイル名を変更して保存し、パターンを使用して名前が重複しないようにします。たとえば、ファイル名に番号を追加します。したがって、同じ名前「fname」のファイルが4つある場合は、このパターンで4つのファイルが必要です。fname --fname(1)--fname(2)--fname(3)

4

2 に答える 2

6

このようなものはおそらく合理的です:

path = 'c:/DL/Others/%s%s' % (filename, file_ext)
uniq = 1
while os.path.exists(path):
  path = 'c:/DL/Others/%s_%d%s' % (filename, uniq, file_ext)
  uniq += 1

元のパスが存在しない場合は何も取得されませんが_1、存在する場合は、空きパスが見つかるまでカウントアップされます。

于 2012-09-11T18:25:05.143 に答える
1

作成時に各ファイル名の数を追跡します。

fname_counts = {}

# ... whatever generates filename and file_ext goes here...

if filename + file_ext in fname_counts:
     fname_counts[filename + file_ext] += 1
else:
     fname_counts[filename + file_ext] = 0


# now check if it's a dupe when you create the path
if fname_counts[filename + file_ext]:
     path = 'C:/DL/Others/%s_%s.%s' % (filename, fname_counts[filename + file_ext], file_ext)
else:
     path = 'C:/DL/Others/' + filename + file_ext 

2 つの重複 (「test.txt」) を使用した作業の例:

>>> filenames_and_exts = [('test', '.txt'), ('test', '.txt'), ('test2', '.txt'), ('test', '.cfg'), ('different_name', '.txt')]
>>> fname_counts = {}
>>> for filename, file_ext in filenames_and_exts:
    if filename + file_ext in fname_counts:
        fname_counts[filename + file_ext] += 1
    else:
        fname_counts[filename + file_ext] = 0
    if fname_counts[filename + file_ext]:
        path = 'C:/DL/Others/%s_%s%s' % (filename, fname_counts[filename + file_ext], file_ext)
    else:
        path = 'C:/DL/Others/' + filename + file_ext
    print path


C:/DL/Others/test.txt
C:/DL/Others/test_1.txt
C:/DL/Others/test2.txt
C:/DL/Others/test.cfg
C:/DL/Others/different_name.txt
于 2012-09-11T18:25:27.920 に答える