用Python向文件添加文本(不替换)
我有一个文件,里面有一些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)来处理数据会让你的生活更简单。这样你就不用处理文件了,用户在使用你的脚本时也会有更多的灵活性。