Обновление: Поскольку у вас нет разрывов строк, чтобы разбить файл, вам, скорее всего, лучше всего просто хлебать файл, делить его соответствующим образом и писать новый файл.Простое решение будет следующим:
import os, tempfile
with open('file.txt') as f,\
tempfile.NamedTemporaryFile('w', dir='.', delete=False) as tf:
# You've got a space only before second copy, so it's a useful partition point
firstcopy, _, _ f.read().partition(' Story1: ')
# Write first copy
tf.write(firstcopy)
# Exiting with block closes temporary file so data is there
# Atomically replace original file with rewritten temporary file
os.replace(tf.name, 'file.txt')
Технически это не полностью , защищающее от фактической потери питания, поскольку данные могут не записываться на диск до обновления метаданных replace
.Если вы параноик, настройте его для явной блокировки до синхронизации данных, добавив следующие две строки непосредственно перед выделением из блока with
(после write
):
tf.flush() # Flushes Python level buffers to OS
os.fsync(tf.fileno()) # Flush OS kernel buffer out to disk, block until done
Старый ответ для случая, когда копии начинаются в отдельных строках:
Найдите, где начинается вторая копия, и обрежьте файл:
seen_story1 = False
with open('file.txt', 'r+') as f:
while True:
pos = f.tell() # Record position before next line
line = f.readline()
if not line:
break # Hit EOF
if line.startswith('Story1:'):
if seen_story1:
# Seen it already, we're in duplicate territory
f.seek(pos) # Go back to end of last line
f.truncate() # Truncate file
break # We're done
else:
seen_story1 = True # Seeing it for the first time
Так как все вы 'Вы делаете удаление дублирующейся информации из конца файла, это безопасно и эффективно;truncate
должен быть атомарным в большинстве операционных систем, поэтому конечные данные освобождаются сразу, без риска частичного повреждения записи или тому подобного.