繁体   English   中英

如何使用python更改文本文件中特定键的特定值

[英]How to change a specific value of a specific key in text file using python

我想知道如何使用 python 替换文本文件中特定键的值

我有这个名为passenger.txt的文本文件具有以下内容:

{'Civil ID':'1', 'Name':'Mike', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':''}

我想将Status值替换为Sometext而不是空白,我已经有了一个代码,但它替换了键而不是值。 所以,我想知道如何更改值而不是键。

这是代码:

passenger_db = "passenger.txt"
with open(passenger_db, "r+") as file:
  for single_line in f:
     x = single_line.replace('Status', 'Sometext')
     file.write(x)

我希望有人会帮助我。

lines = []
with open('passenger.txt') as f:
    for line in f.readlines():
        passenger = eval(line)

        # If you wish to update only certain strings
        if passenger['Civil ID'] == '1':
            passenger['Status'] = 'New status'

        lines.append(str(passenger))

with open('new_file.txt', 'w') as f:
    for line in lines:
        f.write(f'{line}\n')

解释:

恐怕你唯一的选择是:

  1. 阅读整个文件
  2. 将每一行转换为 python 对象
  3. 替换对象中的键
  4. 把它变回刺
  5. 再次将结果写入文件

您可以使用yaml模块将每一行解析为字典,然后您只需使用键名更新值

import yaml

with open('passenger.txt') as fp, open('output.txt', 'w') as fw:
  for line in fp:
    data = yaml.safe_load(line)
    data['Status'] = 'Some text'
    fw.write(str(data) + '\n')

但最好使用带有对象列表的 json 文件,这样你就不需要解析每一行

使用 RegEx 替换

如果您不想在 Python dict 对象中加载每一行数据并修改值(这是一种非常好的方法),那么使用 RegEx 将是一个不错的选择。

在搜索或操作字符串内容时,正则表达式是一个非常强大的工具。

对于输入的 txt 文件:

{'Civil ID':'1', 'Name':'Mike', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':''}
{'Civil ID':'2', 'Name':'John', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':'foo'}
{'Civil ID':'3', 'Name':'Mary', 'DOB':'12/2/2000', 'Gender':'Female', 'Customs fine':'', 'Status':'bar'}
import re


def set_values(filename: str, key: str, value: str):
    with open(filename) as f:
        text = f.read()
    updated_text = re.sub(f"(?<='{key}':').*(?='}})", value, text)
    with open(filename, 'w') as f:
        f.write(updated_text)


set_values('passenger.txt', 'Status', 'Sometext')

该脚本将所有出现的'Status':'<any-text>'模式替换为Sometext

结果:

{'Civil ID':'1', 'Name':'Mike', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':'Sometext'}
{'Civil ID':'2', 'Name':'John', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':'Sometext'}
{'Civil ID':'3', 'Name':'Mary', 'DOB':'12/2/2000', 'Gender':'Female', 'Customs fine':'', 'Status':'Sometext'}

如果只想修改一行而不是整个文件,只需在读取文件后遍历这些行并找到要修改的行,然后应用正则表达式替换。

您还可以根据替换文本文件中其他内容的需要调整 RegEx 模式。

最好使用 JSON 或 pickle。 但如果你必须:

import ast, pathlib
passenger_db = Path("passenger.txt")
data = ast.literal_eval(passenger_db.read_text())
data['Status'] = 'SomeText'
passenger_db.write_text(str(data))

许多解决方案之一。

输入文件passenger.txt

{'Civil ID':'1', 'Name':'Mike', 'DOB':'12/2/2000', 'Gender':'Male', 'Customs fine':'', 'Status':''}

代码:

from ast import literal_eval
passenger_db = "passenger.txt"
with open(passenger_db) as file:
    lines = [literal_eval(x) for x in file]

with open(passenger_db, "w") as file:
    for line in lines:
        line['Status'] = "Sometext"
        file.write(str(line))

结果:

{'Civil ID': '1', 'Name': 'Mike', 'DOB': '12/2/2000', 'Gender': 'Male', 'Customs fine': '', 'Status': 'Sometext'}

另一种解决方法:如果使用inplace=1参数,Python 标准库的fileinput模块会原地重写一个文件:

import fileinput
import sys
passenger_db = "passenger.txt"
for line in fileinput.input('passenger.txt', inplace=1):
    sys.stdout.write(line.replace("'Status': ''", "'Status': 'Sometext'"))

结果:

{'Civil ID': '1', 'Name': 'Mike', 'DOB': '12/2/2000', 'Gender': 'Male', 'Customs fine': '', 'Status': 'Sometext'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM