Python: как создать последовательные имена файлов?

Я хочу, чтобы моя программа могла записывать файлы в последовательном формате, например: file1.txt, file2.txt, file3.txt. Он предназначен только для записи одного файла при выполнении кода. Он не может перезаписывать существующие файлы и ДОЛЖЕН быть создан. Я в тупике.


person Mister X    schedule 08.03.2010    source источник
comment
Дубликат: stackoverflow.com/questions /2401235/. Пожалуйста, отредактируйте свои вопросы, не публикуйте один и тот же вопрос снова.   -  person S.Lott    schedule 08.03.2010
comment
Это было не то же самое, я спрашивал, как реализовать счетчик, я не был уверен, как это сделать. Извините за путаницу, я просто подумал, что было бы хорошо спросить об этом отдельно, чтобы любой, кому нужно это знать, вместо этого мог найти его с помощью поиска.   -  person Mister X    schedule 09.03.2010
comment
Классическим решением этой проблемы является использование флагов O_CREAT | O_EXCEL для создания файла при использовании системного вызова open. Я написал пакет, который использует это и упрощает создание таких файлов: pypi.python.org/pypi/seqfile   -  person musically_ut    schedule 27.04.2015


Ответы (3)


Два варианта:

  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. Вы можете добавлять комментарии и другие маркеры в этот файл, чтобы упростить учет.

Проверьте каталог.

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

Помедленнее. Никогда не было проблем с синхронизацией.

person S.Lott    schedule 08.03.2010
comment
stackoverflow.com/questions/2401235 / - person badp; 08.03.2010

Или вы можете добавить текущее системное время, чтобы сделать уникальные имена файлов...

person ultrajohn    schedule 08.03.2010

Вот как я это реализовал:

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)

Спасибо Дариусу Бэкону за функции естественной сортировки (см. его ответ здесь: https://stackoverflow.com/a/341730)

Извините, если приведенный выше код неверен

person Nuno Furtado    schedule 27.03.2014
comment
Предложение: чтобы избежать каких-либо проблем с TOCTTOU, создайте цикл, в котором вы пытаетесь открыть файл с флагом создания, что должно вызвать исключение, если оно уже существует, которое вы можете поймать, а затем повторить попытку со следующим номером. - person Darius Bacon; 10.04.2014