【问题标题】:How to edit a text file at a specific line or location如何在特定行或位置编辑文本文件
【发布时间】:2021-10-14 13:15:12
【问题描述】:

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

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 : DATATYPE2;
Var3 : DATATYPE3;(描述 Var3)
Var4 : DATATYPE4;
END_GROUP
Var1 : DATATYPE1;(描述 Var1)
Var2 : DATATYPE2;(描述 Var2)
Var3 : DATATYPE3;(描述 Var3)
Var4 : DATATYPE4;(描述 Var4)

没有编辑提到的特定位置,而是在最后添加的可能原因是什么。提前致谢。

【问题讨论】:

  • 这能回答你的问题吗? How to modify a text file?
  • 感谢您的建议。在发布我的问题之前,我查看了上述解决方案。这是否意味着如果不将文件内容复制到新文件中就无法编辑文件?
  • 是的,您必须执行读/写循环才能修改文件的某些部分。如果你想避免复制,你可以用你修改过的文件覆盖旧文件。

标签: python python-3.x file-writing


【解决方案1】:

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

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

【讨论】:

  • 谢谢@scotty3785。这是我所期待的,它无需重写整个文件即可工作。但是,如果我希望迭代地调用函数“search_write_in_file”,那么我需要将正则表达式作为变量传递,而不是像 r'(DATATYPE2;\n)。如何实现?
  • @abhi0687 我写的函数已经支持正则表达式作为变量传递。与其在函数调用中直接使用正则表达式,不如将其作为单独的变量传入。 my_regex = r'(DATATYPE2:\n)' 然后search_write_in_file('text_to_edit.txt', my_regex, 'test2')
【解决方案2】:

您已以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() 方法一次准确地获取一行,对其进行编辑并将其写回。不过,您仍然需要谨慎使用该模式。

【讨论】:

    【解决方案3】:

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

    在此网站上了解更多信息: https://www.w3schools.com/python/ref_file_seek.asp

    【讨论】:

    • 一个例子可以提高这个答案的质量。
    • 我添加了一个网站链接,您可以在其中找到更多关于这个和其他 python 文件方法的信息。
    • 嗨,欢迎来到 SO。网站链接很有帮助;但是,如果该站点因某种原因被删除,建议直接在解决方案中包含一个示例。谢谢
    • 好的,我将尝试在此添加代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2012-03-09
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多