Удалить двойное содержимое файла - PullRequest
0 голосов
/ 24 мая 2019

Ранее я писал файл на python и дважды писал одно и то же содержимое, пытаясь запустить сценарий во второй раз.

Вот содержимое моего файла:

Story1: короткий рассказ - это прозаическая литература, которую обычно можно прочитать за один присест и которая посвящена отдельному эпизоду или сериисвязанных инцидентов, с целью вызвать «единый эффект» или настроение, однако есть много исключений из этого.Словарное определение - это «придуманный нарративный нарратив, более короткий, чем роман, обычно имеющий дело с несколькими персонажами и нацеленный на единство эффекта и часто концентрирующийся на создании настроения, а не сюжета. История 1: Короткая история - это фрагмент прозы, который обычноможет читаться за один присест и фокусируется на отдельном инциденте или серии связанных инцидентов с намерением вызвать «одиночный эффект» или настроение, однако есть много исключений из этого. Словарное определение - «выдуманный прозаический рассказ»короче, чем роман, обычно имеющий дело с несколькими персонажами и стремящийся к единству эффекта и часто концентрирующийся на создании настроения, а не сюжета.

Я использую такой оператор Python Set, но это победило 'В моем случае это не работает:

uniqlines = set(open('file.txt').readlines())
bar = open('file', 'w').writelines(set(uniqlines))

В моем случае теперь есть символы новой строки, поэтому все читается один раз.Я хочу иметь возможность удалить содержимое после Story1: встречается во второй раз.Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы можете использовать метод поиска.

# set the word you want to look for
myword = "Story1"

#read the file into a variable called text
with open('file.txt', 'r+') as fin:
    text = fin.read()

#find your word for the first time. This method returns  the lowest index of the substring if it is found.
# That's why we add the length of the word we are looking for.
index_first_time_found = text.find(myword) + len(myword)

# We search again, but now we start looking from the index of our previous result.
index_second_time_found = text.find(myword, index_first_time_found)

# We cut of everything upto the index of our second index.
new_text = text[:index_second_time_found]

print(new_text)
1 голос
/ 24 мая 2019

Обновление: Поскольку у вас нет разрывов строк, чтобы разбить файл, вам, скорее всего, лучше всего просто хлебать файл, делить его соответствующим образом и писать новый файл.Простое решение будет следующим:

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

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