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

2024-05-16 01:33:18 发布

您现在位置: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)

Tags: 文件ofthetxtnewforlinecolumn
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

如果要使用可应用于逐行编辑某些数据的模式,可以执行以下操作:

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)

请注意,我没有在每个字符串的末尾剥离换行符,也没有在函数中剥离换行符,也没有在调用它的隐式循环中剥离换行符,因此要正确地连接这些行,我们使用空字符串''。你知道吗

还要注意的是,对于一个大的输入文件,在输出缓冲区满之前,文件是延迟读取的(如果您知道自己在做什么,请使用^{}buffering=...opt arg来更改缓冲区大小),因此这在内存方面特别有效。你知道吗

相关问题 更多 >