2

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

这是我的代码的一部分:

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)

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

如果原始路径不存在,您将得到 no _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 

使用两个重复项(“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 回答