Python-写入文件的特定部分,而不是通过line-Regex
我想做的是将值写入文件的特定部分。这个部分可以在文件中的任何位置,但只会出现一次,因此我不相信添加一行就能解决这个问题 我拥有的基本上是一个文本文件,其中包含:Python-写入文件的特定部分,而不是通过line-Regex,python,regex,file,text,io,Python,Regex,File,Text,Io,我想做的是将值写入文件的特定部分。这个部分可以在文件中的任何位置,但只会出现一次,因此我不相信添加一行就能解决这个问题 我拥有的基本上是一个文本文件,其中包含: TitleThing ( Some info = 22 (More info = 22.2) Tags = [] ) 我想做的是在标记=]之后的[]内的文件中添加一个字符串 看起来像: TitleThing ( Some info = 22 Otherthing -- "56.foo" (More info = 22.2)
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 = [(.*)]')
但我不知道该怎么做
我希望能得到一些帮助
谢谢。一个肮脏的想法:你可以阅读带有
标记的行=…
,评估它,编辑列表,然后重写它:
exec('Tags = ["newtag"]')
Tags.append("othertag")
f.write('Tags = {}'.format(Tags))
其中f
是一个新文件,您可以在其中编写编辑的版本(或使用另一个答案中的临时文件)
(当然,执行任意字符串总是很危险的,但如果它是一次性脚本,那么它就可以工作。)一个肮脏的想法:你可以用
标记=…
读取行,计算它,编辑列表,然后重写它:
exec('Tags = ["newtag"]')
Tags.append("othertag")
f.write('Tags = {}'.format(Tags))
其中f
是一个新文件,您可以在其中编写编辑的版本(或使用另一个答案中的临时文件)
(当然,执行任意字符串总是很危险的,但如果它是一次性脚本,则该操作有效。)您需要写入临时文件,然后覆盖原始文件
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:
您需要写入临时文件,然后覆盖原始文件
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:
你不需要正则表达式,但你需要写一个临时文件谢谢你的回复!您能解释一下吗?您正在寻找
标记=…
?文本文件只是从第一个字符到最后一个字符的一个字节字符串。我们将分隔符视为换行符,但每个分隔符都只是文件中的一个字符。只能添加到文件末尾(追加)。如果你写到其他地方,你只会在下一行覆盖现有文本。你不需要正则表达式,但你需要写到一个临时文件谢谢你的回复!您能解释一下吗?您正在寻找标记=…
?文本文件只是从第一个字符到最后一个字符的一个字节字符串。我们将分隔符视为换行符,但每个分隔符都只是文件中的一个字符。只能添加到文件末尾(追加)。如果你写到其他地方,你只会覆盖下一行的现有文本。这看起来不错,但当我运行它时,文件不会被写入。不确定我做错了什么。@flec8,。根据你所提供的,这绝对是正确的。你确定你使用了正确的字符串来匹配并且没有前导空格吗?啊,你是对的!我有的是标题(Some info=22(More info=22.2)“Tags”:[],lol,然后用它来代替问题中的内容,这是一行吗?这看起来不错,但当我运行它时,文件没有写入。不确定我做错了什么。@flec8,。根据你所提供的,这绝对是正确的。你确定你使用了正确的字符串来匹配并且没有前导空格吗?啊,你是对的!我有的是标题(Some info=22(More info=22.2)“Tags”:[],lol,然后用它代替问题中的内容,这是一行吗?