我想要做的是将值写入文件的特定部分。这部分可以在文件中的任何位置,但只会出现一次,因此我不相信添加一行就能解决它。
我所拥有的本质上是一个文本文件:
TitleThing (
Some info = 22
(More info = 22.2)
Tags = []
)
我想做的是在标签=后面的[]内部的文件中添加一个字符串。
看起来像:
TitleThing (
Some info = 22
Otherthing -- "56.foo"
(More info = 22.2)
Tags = ["newtag"]
)
另一个问题是可能存在标签:
TitleThing (
Some info = 22
(More info = 22.2)
Tags = ["oldtag, othertag"]
)
在这种情况下,我想将“newtag”添加到退出列表中,以便首先显示。
我从:
开始tagRegex = re.compile(r'Tags = [(.*)]')
但我不确定如何继续。
会喜欢一些帮助!
感谢。
答案 0 :(得分:0)
一个肮脏的想法:你可以阅读Tags = ...
行,评估它,编辑列表,然后重写它:
exec('Tags = ["newtag"]')
Tags.append("othertag")
f.write('Tags = {}'.format(Tags))
其中f
是一个新文件,您可以在其中编写已编辑的版本(或使用临时文件,如另一个答案中所示)。
(当然,执行任意字符串总是很危险,但如果是一次性脚本则可行。)
答案 1 :(得分:0)
您需要写入临时文件,然后覆盖原始文件。
from tempfile import NamedTemporaryFile
from shutil import move
def add_new(new):
with open("check.txt") as f, NamedTemporaryFile("w",delete=False) as tmp:
for line in f:
if line.startswith("Tags ="):
repl = ", {}]".format(new) if "[]" not in line else "{}]".format(new)
tmp.write(line.replace("]", repl))
tmp.writelines(f)
break
tmp.write(line)
move(tmp.name, "check.txt")
然后传递新值:
In [3]: cat check.txt
TitleThing (
Some info = 22
(More info = 22.2)
Tags = []
)
In [4]: add_new("newvalue")
In [5]: cat check.txt
TitleThing (
Some info = 22
(More info = 22.2)
Tags = [newvalue]
)
In [6]: add_new("newvalue2")
In [7]: cat check.txt
TitleThing (
Some info = 22
(More info = 22.2)
Tags = [newvalue, newvalue2]
)
如果您想在开始时使用新值,则需要稍微更改逻辑:
repl = "[{}, ".format(new) if "[]" not in line else "[{}".format(new)
tmp.write(line.replace("[", repl))
根据您的评论,将if更改为:
if '"Tags": [' in line: