[英]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')
解释:
恐怕你唯一的选择是:
您可以使用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 文件,这样你就不需要解析每一行
如果您不想在 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.