【问题标题】:Python: How do I create sequential file names?Python:如何创建顺序文件名?
【发布时间】:2011-01-24 22:37:06
【问题描述】:

我希望我的程序能够以顺序格式写入文件,即:file1.txt、file2.txt、file3.txt。它仅用于在执行代码时编写单个文件。它不能覆盖任何现有文件,并且必须创建它。我被难住了。

【问题讨论】:

  • 重复:stackoverflow.com/questions/2401235/…。请编辑您的问题,不要简单地再次发布相同的问题。
  • 不一样,我在问如何实现计数器,我不知道该怎么做。很抱歉有任何混淆,我只是认为最好单独询问,这样任何需要知道的人都可以通过搜索找到它。
  • 对此的经典解决方案是使用O_CREAT | O_EXCEL 标志来创建文件,同时使用系统调用open。我编写了一个包,它利用了这一点并使创建此类文件变得更容易:pypi.python.org/pypi/seqfile

标签: python filesystems


【解决方案1】:

两个选择:

  1. 计数器文件。

  2. 检查目录。

计数器文件。

with open("thecounter.data","r") as counter:
    count= int( counter.read() )

count += 1

每次您创建一个新文件时,您还使用 合适的号码。非常非常快。不过理论上是可以的 让两者不同步。在发生崩溃时。

您还可以通过将计数器文件制作成一小块来使计数器文件更智能 Python 代码。

settings= {}
execfile( "thecounter.py", settings )
count = settings['count']

然后,当您更新文件时,您会编写一小段 Python 代码:count = someNumber。您可以在此文件中添加 cmets 和其他标记以简化您的记账。

检查目录。

import os
def numbers( path ):
    for filename in os.listdir(path):
        name, _ = os.path.splitext()
        yield int(name[4:])
count = max( numbers( '/path/to/files' ) )

count += 1

慢一点。从来没有同步问题。

【解决方案2】:

或者您可以附加当前系统时间以创建唯一的文件名...

【讨论】:

    【解决方案3】:

    这是我的实现方式:

    import os
    import glob
    import re
    
    #we need natural sort to avoid having the list sorted as such:
    #['./folder1.txt', './folder10.txt', './folder2.txt', './folder9.txt']
    def sorted_nicely(strings):
        "Sort strings the way humans are said to expect."
        return sorted(strings, key=natural_sort_key)
    
    def natural_sort_key(key):
        import re
        return [int(t) if t.isdigit() else t for t in re.split(r'(\d+)', key)]
    
    #check if folder.txt exists
    filename = "folder.txt" #default file name
    
    #if it does find the last count
    if(os.path.exists(filename)):
            result = sorted_nicely( glob.glob("./folder[0-9]*.txt"))
            if(len(result)==0):
                    filename="folder1.txt"
            else:
                    last_result = result[-1]
                    number = re.search( "folder([0-9]*).txt",last_result).group(1)
                    filename="folder%i.txt"%+(int(number)+1)
    

    感谢 Darius Bacon 提供的自然排序功能(在此处查看他的答案:https://stackoverflow.com/a/341730)

    对不起,如果上面的代码是丑陋的

    【讨论】:

    • 建议:为避免任何 TOCTTOU 问题,请使其成为一个循环,在该循环中尝试使用创建标志打开文件,如果该文件已存在,则会导致异常,您可以捕获该异常,然后重试下一个号码。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 2022-10-20
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多