我有一个像这样的文件
Daniel 400 411 f
Mark 976 315 g
我想在第[2]行中添加20并从第[1]行中减去20并打印新结果,覆盖此行或新文件。这是我的尝试。
f=open('w', 'r')
r = open('w2','a')
lines=f.readlines()
for line in lines:
new_list = line.rstrip('\r\n').split('\t')
q_start=int(new_list[1]) - 20
q_end=int(new_list[2]) + 20
# I think something is missing here, but I don't know what
r.writelines(lines)
f.close()
r.close()
预期结果
Daniel 380 431 f
Mark 956 335 g
答案 0 :(得分:4)
f=open('w', 'r')
r=open('w2','a')
lines=f.readlines()
for line in lines:
new_list = line.rstrip('\r\n').split('\t')
new_list[1] = str(int(new_list[1]) - 20)
new_list[2] = str(int(new_list[2]) + 20)
r.write("\t".join(new_list)+"\n")
f.close()
r.close()
这应该有效。基本上,您需要先将线分割成线段,然后修改所需的部分,然后将它们拼接在一起。
答案 1 :(得分:3)
确实没有必要将所有行读入内存,然后循环遍历它们。它只是延长了代码并且效率较低。相反,尝试
TOKEN : { < #UTF_LETTER : \p{L} > }
请注意使用with
to open 'w2'
和more efficient loop over the 'w'
's lines。
编辑地址评论
请注意,如果您有多列(但仍需要仅更新位于1和2列的列),则可以将最后一行更改为
with open('w2','w') as out:
for line in open('w', 'r'):
new_list = line.rstrip('\r\n').split('\t')
q_start=int(new_list[1]) - 20
q_end=int(new_list[2]) + 20
out.write('\t'.join([line[0], str(q_start), str(q_end), line[3]]) + '\n')
答案 2 :(得分:1)
我看到你已经接受了答案,但是,这是我的评论。您的代码中存在一些错误。第一个是,即使您正确计算了值,也可以将它们存储到两个之后未使用的变量(q_start
和q_end
)中。
第二个错误是您在输出文件中写入未更改的原始数据(lines
列表)并在循环内执行此操作(检查您的标识)。因此,我相信你的输出是原始文件的N次重复,其中N是其中的行数。
可能的错误是使用'a'
打开输出文件。如果其中有任何内容,则不会删除。由于我不确定你的意图,这可能不是一个错误,但如果你想要一个干净的名单,请注意。
最后,这是我的代码版本,最低限度改为工作。我将'a'
留在输出文件打开过程中,因为我不知道你是否故意这样做。
f=open('w.txt', 'r')
r = open('w2.txt','a')
lines=f.readlines()
for line in lines:
print line
new_list = line.rstrip('\r\n').split(' ')
new_list[1]=str(int(new_list[1]) - 20)
new_list[2]=str(int(new_list[2]) + 20)
r.write('\t'.join(new_list)+"\n")
f.close()
r.close()
我希望这会有所帮助。