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,然后用它代替问题中的内容,这是一行吗?