如何在特定行或位置编辑文本文件

问题描述 投票:0回答:4

我有一个以下格式的文本文件,我正在尝试编辑/更新文件中的文本。

VAR_GROUP
Var1 : DATATYPE1;(描述 Var1)
Var2 : DATATYPE2;(此处要添加的文本)
Var3 : DATATYPE3;(描述 Var3)
Var4 : DATATYPE4;(此处要添加的文本)
END_GROUP

使用Python,我尝试添加某些描述,例如Var3和Var4。使用我编写的代码,逻辑工作正常,但文本被添加到文件末尾而不是所需的位置。

def search_write_in_file(file_name, string_to_search, description):
with open(file_name, 'r+') as file_obj:
    # Read all lines in the file
    for line in file_obj:
        # For each line, check if line contains the string
        line_number += 1
        if (string_to_search in line) and flag_found == 0:
            line = line[:-1]+description+'\n'
            file_obj.write(line)
            flag_found =1

read_obj.close()

电流输出
VAR_GROUP
Var1 : DATATYPE1;(描述 Var)
Var2:数据类型2;
Var3 : DATATYPE3;(描述 Var3)
Var4:数据类型4;
END_GROUP
Var1 : DATATYPE1;(描述 Var1)
Var2 : DATATYPE2;(描述 Var2)
Var3 : DATATYPE3;(描述 Var3)
Var4 : DATATYPE4;(描述 Var4)

可能是什么原因导致上述具体位置没有被编辑,而是添加到最后。预先感谢。

python python-3.x file-writing
4个回答
1
投票

使用Python的seek()函数。使用它,您可以逐个字符地更改文件中的光标位置。 另外,在函数中将模式更改为 a+,因为在 r+ 模式下您只能读取文件。在 w+ 模式下,文件将被覆盖。

在本网站阅读更多相关信息: https://www.w3schools.com/python/ref_file_seek.asp


0
投票

我会使用正则表达式来匹配和替换文件中的文本

import re

def search_write_in_file(file_name, string_to_search, description):
    with open(file_name, 'r+') as file_obj:
        text = file_obj.read()
    new_text = re.sub(string_to_search,r"\1 {0}\n".format(description),text)
    with open(file_name, 'w') as file_obj:
        file_obj.write(new_text)
    print(new_text)

if __name__ == '__main__':
    search_write_in_file('text_to_edit.txt',r'(DATATYPE2;\n)',"test2")
    search_write_in_file('text_to_edit.txt',r'(DATATYPE4;\n)',"test4")

这会将现有文件更新为

VAR_GROUP
Var1 : DATATYPE1;(Description Var)
Var2 : DATATYPE2; test2
Var3 : DATATYPE3;(Description Var3)
Var4 : DATATYPE4; test4
END_GROUP

0
投票

您已在

r+
模式下打开文件。 写入文件需要
w+
a+
模式。 试试这个:

def search_write_in_file(file_name, string_to_search, description):
 lines=[]
 with open(file_name, 'r+') as file_obj:
     # Read all lines in the file
     lines = file_obj.readlines()
 # Make the changes
 for idx in range(len(lines)):
     line = lines[idx]
     # For each line, check if line contains the string
     if (string_to_search in line) and flag_found == 0:
         line = line[:-1]+description+'\n'
         lines[idx]=line
         flag_found =1
 # w+ mode truncates the content and then writes the content back again
 with open(file_name, 'w+') as file_obj:
    file_obj.writelines(line)

或者,您可以使用另一个答案中提到的

seek()
方法一次只获取一行,对其进行编辑并将其写回。不过,您仍然需要谨慎对待该模式。


0
投票
with open(filename, "r+") as file:
    for i, row in enumerate(file):
        if <your test>:
            # your update function
            row = update(row)
            file.seek(i * (len(row)+1))
            file.write(row)
            break
© www.soinside.com 2019 - 2024. All rights reserved.