Python 向列添加值并打印结果

Python 向列添加值并打印结果,python,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

我有一个这样的文件

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

这应该行得通。基本上,您需要先将线条分割成若干段,然后修改所需的部分,并将它们缝合在一起。

实际上不需要将所有线条读入内存,然后循环。它只是延长了代码,效率更低。相反,试试看

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')
请注意的用法,以及

编辑地址注释

请注意,如果您有多个列,但仍需要仅更新第1列和第2列中的列,则可以将最后一行更改为

        out.write('\t'.join([line[0], str(q_start), str(q_end)] + line[3: ]) + '\n')

我知道你已经接受了一个答案,但我还是要发表评论。您的代码中有几个错误。第一个是,即使您正确地计算了值,您也会将它们存储到两个变量q_start和q_end中,这两个变量之后不会使用

第二个错误是,您将行列表中未更改的原始数据写入输出文件,并在循环内执行此操作检查您的标识。因此,我认为您的输出是原始文件的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()

我希望这有帮助

我用join尝试了类似的smth,但没有成功,可能是我犯了一些错误。不管怎样,你的工作正常,谢谢!您还可以尝试在Ami Tavory的答案中使用语法。如果你忘记关闭文件,会更方便、更安全。这很好,但如果一行中有多达10个参数呢?你还需要只更改1和2处的参数吗?是的,我只更改1和2处的参数,但我有10多个列,我不想全部写入,因为我也这样认为,但我确信有一种更有效、更好的方法。。
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()