避免在Python中的文件夹中重复文件名

时间:2012-09-11 18:19:35

标签: python filenames

我想下载一些文件并将它们保存在一个文件夹中,文件名中可能会有一些重复,所以我想避免这种情况发生。 我认为它需要一个自动命名系统,但现在我不知道如何制作它。 我使用shutilurllib2来编写我的函数。

这是我的代码的一部分:

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)

2 个答案:

答案 0 :(得分: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,但如果它确实存在,则会计算到它找到一个空闲路径。

答案 1 :(得分: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