过滤掉一些行

2024-04-25 00:56:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件(a.txt)。这是其中的一小部分:

ENSG00000060642.6   0,023999998 0,015999999 0,666666667 0,006410256 0,006410256 1,000000073 0,016393442 0,016393442 1   0,020202022 0,030303031 1,499999908
ENSG00000149136.3   0,03508772  0,01754386  0,5 0,068627447 0,029411765 0,428571456 0,078947365 0,065789476 0,833333396 0,066666663 0,066666663 1
ENSG00000104889.4   0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000157827.15  0,055555556 0,037037037 0,666666667 0,032258064 0,048387095 1,5 0,150000006 0,024999999 0,16666665  0,222222224 0,037037037 0,166666667
ENSG00000146067.11  0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000167700.4   0,299999982 0   0   0,071428567 0,071428567 1   0   0   #DIV/0! 0   0   #DIV/0!
ENSG00000172137.14  0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 1   0   0
ENSG00000178776.4   0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0! 0   0   #DIV/0!

我要过滤掉所有行,包括“#DIV/0!”,即使只有一个“#DIV/0!”,并生成新的文本文件。你知道吗


Tags: divtxt文本文件
3条回答
with open('a.txt') as f, open('b.txt', 'w') as new_file:
    new_file.writelines([line for line in f if '#DIV/0!' not in line])

编辑:

这种方法可能是最快的。但正如前面与@martineau讨论过的,根据文件的大小,这并不是最好的答案。你知道吗

  • ^{}[line for line in f if '#DIV/0!' not in
    line]
    在python中非常常见,它取代了一段代码:

    l = []
    for line in f:
        if '#DIV/0!' not in line:
            l.append(line)
    

但它更加优化(请参见此处的解释:Efficiency of list comprehensions

^{}加载内存中的所有内容,这样就可以 在数据量巨大的情况下会导致缓冲区溢出。你知道吗

这就是为什么在这里,当您不确定要处理多少数据时,使用增量方法(@martineau's one)更安全!你知道吗

  • ^{}语句替换try-and-catch语句。它也 阻止后自动关闭文件。尽你所能 你看,它也可以是嵌套的:你可以用一个文件打开多个文件 ^{}语句。你知道吗
for line in open('a.txt').read().splitlines():
    if '#DIV/0!' not in line:
        print(line)

您可以这样做,这是增量的(因此它不会一次将整个文件读入内存):

from itertools import ifilter

with open('a.txt', 'r') as inf, open('new.txt', 'w') as outf:
    outf.writelines(ifilter(lambda line: '#DIV/0!' not in line, inf))

相关问题 更多 >