2012-09-11 71 views
0

我想下載一些文件並將它們保存在一個文件夾中,並且文件名中可能存在重複,所以我想避免發生這種情況。 我認爲它需要一個自動命名系統,但現在我不知道如何製作它。 我用shutilurllib2寫我的功能。避免在Python文件夾中重複文件名

這是我的代碼的一部分:

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

如你所知,我們可以檢查,如果一個文件被os.path.exists('path')存在與否。 我想重命名我的文件,並保存它們以避免使用模式重複的名稱,例如通過向文件名添加數字。所以如果有4個文件具有相同的名稱,「fname」,我希望這種模式下有4個文件: FNAME - FNAME(1) - FNAME(2) - FNAME(3)

回答

5

像這樣的東西可能是合理的:

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,但如果它確實存在,它會一直計數直到找到一個空閒的。

+0

很明顯,您可以換出'_'如果你願意的話,可以爲你的父母。 –

+0

謝謝!簡單有效:) – Amir

+0

儘管如此,如果你有很多重複,這是非常低效的。如果您有> 100個重複項,則必須總共執行該循環的> 5000次迭代。 –

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 

在有兩個重複( 「的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