Python - 写入文件的特定部分,而不是按行 - 正则表达式

时间:2016-04-06 21:45:52

标签: 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)

Tags = ["newtag"] 
)

另一个问题是可能存在标签:

TitleThing (
Some info = 22 

(More info = 22.2)
Tags = ["oldtag, othertag"] 
)

在这种情况下,我想将“newtag”添加到退出列表中,以便首先显示。

我从:

开始
tagRegex = re.compile(r'Tags = [(.*)]')

但我不确定如何继续。

会喜欢一些帮助!

感谢。

2 个答案:

答案 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: