如何在python中同时读取和写入文本文件?

时间:2018-10-02 11:08:25

标签: python regex mod-rewrite text-files

我试图打开一个文本文件,阅读它,然后使用正则表达式功能查找要编辑的行,然后修改我的文本文件。但是,发生的事情是,在找到这些行并对其进行编辑之后,我无法再次在文本文件中写入修改后的内容。

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 :(得分:1)

您可以尝试以下操作,目前的问题是,您仅存储和写入修改后的行的最后一次出现,而是最好在内存中创建修改后的文件的副本然后写出(请参见下文) )

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)

答案 1 :(得分:1)

现在代码中发生的事情是,您首先读取with open("\DEMO_houses.txt", "r") as inp:块中的所有行,然后在with open("DEMO_houses.txt", "w") as document1:块中,代码仅写回最后读取的行。由于写入模式"w"会擦除先前的文件,因此代码执行完后,仅保留原始文件的最后一行。

您最好先将所有行读入内存,然后对这些行进行md处理,然后再将它们写回到同一文件中,如下所示:

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)

提供的文件可以毫无问题地存储在内存中,这是一次更好的方法,一次可以读取和修改一行文件,因为内存中的修改要快得多,而二级存储中的文件只需要修改一次