Как читать и писать текстовые файлы одновременно в Python? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь открыть текстовый файл, прочитать его и после использования функции регулярного выражения, чтобы найти, какие строки редактировать, изменить мой текстовый файл.Однако происходит то, что после нахождения строк и их редактирования я не могу снова записать измененный Контент в текстовый файл.

remove_commas = re.compile("House")
answer = {}

global line1

with open("\DEMO_houses.txt", "r") as inp:

    for line in inp:
        if remove_commas.match(line):

            line1 = line.replace(',', '')
            print line1

with open("DEMO_houses.txt", "w") as document1:
        document1.write(line1)

В результате происходит просто удаление моего текстового файла и запись только первой измененной строки.

Текстовый файл выглядит примерно так:

Street : Blue, Red
House: Big, enough
Garden : green, not green

И в новом текстовом файле мне нужно что-то вроде:

Street : Blue, Red
House: Big enough
Garden : green, not green

Если кто-нибудь может мне помочь, я был бы очень признателен.Спасибо

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

То, что происходит сейчас в вашем коде, это то, что вы сначала читаете все строки в блоке with open("\DEMO_houses.txt", "r") as inp:, а затем в блоке with open("DEMO_houses.txt", "w") as document1:, ваш код записывает только последнюю строку чтения.Поскольку режим записи "w" стирает предыдущий файл, после завершения выполнения кода остается только последняя строка исходного файла.

Возможно, вам лучше сначала прочитать все строки в памяти, а затем модифицировать эти строки,и затем записывает их обратно в один и тот же файл следующим образом:

import re

remove_commas = re.compile("House")

data = []
with open("DEMO_houses.txt", "r") as inp:  #Read phase
    data = inp.readlines()  #Reads all lines into data at the same time

for index, item in enumerate(data): #Modify phase, modification happens at once in memory
    if remove_commas.match(item):
        data[index] = item.replace(',', '')

with open("DEMO_houses.txt", "w") as document1: #write back phase
        document1.writelines(data)

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

0 голосов
/ 02 октября 2018

Вы можете попробовать следующее, проблема на данный момент в том, что вы сохраняете и записываете только окончательное вхождение измененной строки, вместо этого лучше создать копию измененного файла в памяти и затем выписать ее (см. Ниже).)

remove_commas = re.compile("House")
answer = {}

with open("\DEMO_houses.txt", "r") as inp:
    new_file_lines = []
    for line in inp:
        if remove_commas.match(line):
            line = line.replace(',', '')
        new_file_lines.append(line)

with open("DEMO_houses.txt", "w") as document1:
        document1.writelines(new_file_lines)
...