我的文本文件很大,我想从第一个文件中创建一个新文件,但要进行一些更改。这是我第一个文件内容的一个小示例:
chr1 transcript 1314046 1314412 + RP5-890O3.3
chr1 transcript 1321091 1326476 - CCNL2
chr1 transcript 1334902 1336467 + RP4-758J18.2
我想更改3rd
和4th columns
。实际上在新文件中:
the 3rd column = (4th column of 1st file) - 30
the 4th column = (4th column of 1st file) + 10
预期输出:
chr1 transcript 1314382 1314422 + RP5-890O3.3
chr1 transcript 1326446 1326486 - CCNL2
chr1 transcript 1336437 1336477 + RP4-758J18.2
我试图用Python做到这一点,并编写了以下代码,但它没有返回我想要的。你知道如何解决吗?
file = open('myfile.txt', 'rb')
new = []
for line in file:
col3 = line[3]-30
col4 = line[3]+10
new.append(col3\tcol4)
with open('outfile.txt', "w") as f:
for item in new:
f.write("%s\n" % item)
答案 0 :(得分:2)
这可以做到:
with open('myfile.txt') as f, open('outfile.txt', 'w') as w:
data = f.readlines()
result = []
for line in data:
line = line.split()
line[2] = str(int(line[3]) - 30)
line[3] = str(int(line[3]) + 10)
result.append(line)
for r in result:
w.write('\t'.join(r) + '\n')
要成功将int
添加到值中,您需要将其转换为int
,还要将结果值转换为str
,以避免在写入outfile
时出错。
生成的文件如下所示:
chr1 transcript 1314382 1314422 + RP5-890O3.3
chr1 transcript 1326446 1326486 - CCNL2
chr1 transcript 1336437 1336477 + RP4-758J18.2
答案 1 :(得分:0)
如果要使用可应用于逐行编辑某些数据的模式,则可以执行以下操作:
with open(...) as input, open(..., 'w') as output:
output.write(''.join(mutate(line) for line in input))
当然,mutate
的定义取决于您的具体任务
def mutate(line):
l = line.split()
l[2] = int(l[2])-30
l[3] = int(l[3])+10
return ' '.join(str(item) for item in l)
请注意,我不会在每个字符串的末尾删除换行符,在函数中也不会在调用它的隐式循环中删除换行符,因此,为了正确连接这些行,我们使用空字符串''
。
还请注意,如果输入文件很大,则会延迟读取文件,直到输出缓冲区已满(如果您知道什么,请使用open
buffering=...
opt arg更改缓冲区大小)您正在执行的操作),以便在内存方面特别有效。