过滤掉一些行

时间:2016-08-09 07:19:46

标签: python file

我有一个文本文件(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!”,也要制作一个新的文本文件。

4 个答案:

答案 0 :(得分:1)

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所讨论的那样,根据文件的大小,这可能不是最好的答案。

  • list comprehension [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

list comprehension将所有内容加载到内存中,因此可以    在大量数据的情况下导致缓冲区溢出。

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

  • with语句替换try和catch。它也是 阻止后自动关闭文件。尽你所能 看,它也可以嵌套:你可以用一个打开几个文件 with声明。

答案 1 :(得分:1)

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

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))

答案 2 :(得分:0)

for line in open('a.txt').read().splitlines():
    if '#DIV/0!' not in line:
        print(line)

答案 3 :(得分:0)

state.go