在python中更改文本文件时出现问题

时间:2018-11-13 12:46:16

标签: python

我的文本文件很大,我想从第一个文件中创建一个新文件,但要进行一些更改。这是我第一个文件内容的一个小示例:

chr1    transcript  1314046 1314412 +   RP5-890O3.3
chr1    transcript  1321091 1326476 -   CCNL2
chr1    transcript  1334902 1336467 +   RP4-758J18.2

我想更改3rd4th 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)

2 个答案:

答案 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更改缓冲区大小)您正在执行的操作),以便在内存方面特别有效。