【问题标题】:Avoid duplicate file names in a folder in Python避免 Python 文件夹中的文件名重复
【发布时间】:2012-09-11 18:19:35
【问题描述】:

我想下载一些文件并将它们保存在一个文件夹中,文件名可能有一些重复,所以我想避免这种情况发生。 我认为它需要一个自动命名系统,但现在我不知道如何制作它。 我使用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)

【问题讨论】:

    标签: python filenames


    【解决方案1】:

    这样的事情可能是合理的:

    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,但如果存在,它将计数直到找到一个空闲的路径。

    【讨论】:

    • 如果您愿意,显然可以将_ 换成括号。
    • 谢谢!简单有效:)
    • 但是,如果您有很多重复项,这将非常低效。如果您有 >100 个重复项,则总共必须对该循环进行 >5000 次迭代。
    • @DanielDiPaolo - 仅当您为每个文件重置 uniq 指示符时,如果您知道它们都共享一个共同的前缀,则没有必要这样做。无论如何,如果卷确实变得非常大,记住创建的文件名很简单。
    【解决方案2】:

    在创建文件时跟踪每个文件名的计数:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多