Python, как стереть файл, когда он открыт с помощью «с» - PullRequest
0 голосов
/ 13 марта 2019

Я сохраняю номер итерации цикла моего скрипта в файле контрольных точек:

with open('checkpoint.txt', 'w') as checkpoint_file:
    for i range(1000):
        //do stuff
        checkpoint_file.write(str(i) + '\n')

Это будет писать новую строку в моем файле для каждой итерации.

Что бы я хотелНапример, когда я прерываю скрипт, нужно иметь только одну строку с номером последней итерации, поэтому я хотел бы стереть содержимое файла "checkpoint.txt", а затем записать свой номер итерации в первой строке (или напрямую заменить первуюлиния, если это возможно).

Я знаю, что если я закрою файл, а затем снова открою его с помощью with open('checkpoint.txt', 'w'), его содержимое будет удалено, но я бы хотел оставить файл открытым, если это возможно для эффективности.

Какой лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 13 марта 2019

seek ing перед каждым write (и переключением на буферизацию строки, чтобы избежать необходимости flush по отдельности) будет делать:

# buffering=1 means you automatically flush after writing a line
with open('checkpoint.txt', 'w', buffering=1) as checkpoint_file:
    for i in range(1000):
        //do stuff
        checkpoint_file.seek(0)  # Seek back to beginning of file so next write replaces contents
        checkpoint_file.write(str(i) + '\n')
0 голосов
/ 13 марта 2019

Как вы прерываете сценарий?

Если это что-то вроде KeyboardInterrupt, то вы можете попробовать следующее:

with open('checkpoint.txt', 'w') as checkpoint_file:
    for i range(1000):
        # do stuff
        try:
            checkpoint_file.write(str(i) + '\n')
        except KeyboardInterrupt:
            checkpoint_file.seek(0)
            checkpoint_file.truncate()
            checkpoint_file.write(str(i))
0 голосов
/ 13 марта 2019

Искать в начале файла перед каждой записью.Смотри https://docs.python.org/2/library/stdtypes.html?highlight=seek#file.seek

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...