2012-09-11 69 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