向列添加值并打印结果

时间:2016-10-07 11:16:29

标签: python

我有一个像这样的文件

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

3 个答案:

答案 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_startq_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()

我希望这会有所帮助。