Я хочу, чтобы моя программа могла записывать файлы в последовательном формате, например: file1.txt, file2.txt, file3.txt. Он предназначен только для записи одного файла при выполнении кода. Он не может перезаписывать существующие файлы и ДОЛЖЕН быть создан. Я в тупике.
Python: как создать последовательные имена файлов?
Ответы (3)
Два варианта:
Файл счетчика.
Проверьте каталог.
Файл счетчика.
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
Помедленнее. Никогда не было проблем с синхронизацией.
Или вы можете добавить текущее системное время, чтобы сделать уникальные имена файлов...
Вот как я это реализовал:
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)
Извините, если приведенный выше код неверен
O_CREAT | O_EXCEL
для создания файла при использовании системного вызоваopen
. Я написал пакет, который использует это и упрощает создание таких файлов: pypi.python.org/pypi/seqfile - person musically_ut   schedule 27.04.2015