用Python向文件添加文本(不替换)

7 投票
6 回答
2350 浏览
提问于 2025-04-17 10:06

我有一个文件,里面有一些ID和信息,像这样:

1oMZgkoaz3o 2011-12-29T01:23:00.000Z 9 503 ApolloIsMyCoPilot
nUW1TomCSQg 2011-12-29T01:23:15.000Z 9 348 grea7stuff
tJuLnRrAcs0 2011-12-29T01:26:20.000Z 9 123 AdelGaming
tyi5g0mnPIs 2011-12-29T01:28:07.000Z 9 703 PreferredGaming

我想在某些行上添加一个标记,所以如果我有一个字典

flags = {'1oMZgkoaz3o': flag1, 'tJuLnRrAcs0': flag2}

我想要的结果是

1oMZgkoaz3o 2011-12-29T01:23:00.000Z 9 503 ApolloIsMyCoPilot flag1
nUW1TomCSQg 2011-12-29T01:23:15.000Z 9 348 grea7stuff
tJuLnRrAcs0 2011-12-29T01:26:20.000Z 9 123 AdelGaming flag2
tyi5g0mnPIs 2011-12-29T01:28:07.000Z 9 703 PreferredGaming

所以我写了这个代码

l = True
while l is True:
    a = f.readline()
    try a.split(' ')[0] in flags.iterkeys():
        f.seek(-1,1)
        f.write(' '+str(flags[a.split(' ')[0]])+'\n')
        del flags[a.split(' ')[0]]
    except IndexError:
        l = False

我的Python代码可能写得不好,但问题是我用这个代码在替换文本,所以文件变得很乱。我该怎么做才能不替换呢?如果你有更好的代码建议,我也很欢迎...

6 个回答

2

我想使用 stdin/stdout 重定向:

#!/usr/bin/env python3
import sys

flags = {'1oMZgkoaz3o': 'flag1', 'tJuLnRrAcs0': 'flag2'}

for line in sys.stdin:
    line = line.rstrip()
    k = line.split()[0]
    if k in flags:
        print(line, flags[k])
    else:
        print(line)

$ python3 script.py <input.txt >output.txt
$ cat output.txt
1oMZgkoaz3o 2011-12-29T01:23:00.000Z 9 503 ApolloIsMyCoPilot flag1
nUW1TomCSQg 2011-12-29T01:23:15.000Z 9 348 grea7stuff
tJuLnRrAcs0 2011-12-29T01:26:20.000Z 9 123 AdelGaming flag2
tyi5g0mnPIs 2011-12-29T01:28:07.000Z 9 703 PreferredGaming
9

你不能直接在文件里写东西和“插入”内容。最好的办法是先读取你的文件,把里面的内容修改后写到一个新文件里,然后再根据需要把新文件重命名。

6

我看到这里有两个问题:

从同一个文件读取和写入

这样做效果不好。更好的方法是从一个文件读取数据,然后写入到另一个文件(这样,如果你的程序出错了,也不会丢失数据)。举个例子:

input_file = open('infile.txt', 'r')
output_file = open('outfile.txt', 'w')
for line in input_file:
    line += "transformed"
    output_file.write(line)

语法和语义错误

你的代码片段中有一个语法错误,下面这一行

try a.split(' ')[0] in flags.iterkeys():

是不合法的(Python会对此报错!)。

还有一些其他需要注意的地方:

  • in flags.iterkeys()in flags是一样的意思
  • 另外,你可以直接用while l来代替while l is True。更好的是,你可以完全去掉标志变量l,如果发生错误就用break跳出循环。

我的尝试

input_file = open('infile.txt', 'r')
output_file = open('outfile.txt', 'w')
flags = { ... }

for line in input_file:
    parts = line.strip().split()
    if parts[0] in flags:
        line = line + ' ' + flags[parts[0]]
    output_file.write(line + "\n")

如果你知道怎么使用命令行,使用标准输入和输出(STDIN/STDOUT)来处理数据会让你的生活更简单。这样你就不用处理文件了,用户在使用你的脚本时也会有更多的灵活性。

撰写回答