我想下载一些文件并将它们保存在一个文件夹中,文件名中可能会有一些重复,所以我想避免这种情况发生。
我认为它需要一个自动命名系统,但现在我不知道如何制作它。
我使用shutil
和urllib2
来编写我的函数。
这是我的代码的一部分:
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)
答案 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