2016-08-09 39 views
2

我有一个文本文件(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!” 。

+1

是的,我们做的。你有什么尝试? – Julien

+0

作为一个方面说明,你可能不一定需要python。如果你在* nix机器上,你可以使用'grep'。如果你有最初的excel,你可以使用它来产生一个干净的文件。 –

回答

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

嗨马蒂诺,那太好了。昨天我试图使用ifilter,但没有工作。现在我知道问题是什么。 – user3925736

+0

@martineau,你能解释一下为什么ifilter在这种情况下比一个简单的'list comprehension'更强大吗? 例如 'outf.writelines([如果'#DIV/0!'不在行]中的行中的行)' 我被告知,列表推理比Python更麻烦,但我相信你有你的原因。 –

+1

@Max:列表解析绝对是Pythonic,但并不奇怪,它们创建一个列表,它要求所有元素同时在内存中 - 这通常很好。但是,如果可能有很多这样的项目和/或没有理由让它们保留,那么Pythonic也可以迭代地处理它们,一次一个项目,使用最少量的资源。据我所知,就是这种情况。 – martineau

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

请编辑更多信息。仅限代码和“尝试这个”的答案是不鼓励的,因为它们不包含可搜索的内容,也不解释为什么有人应该“尝试这个”。我们在这里努力成为知识的资源。 –

0
new_file = open('output.txt' , 'w') 
for line in open('a.txt').read().splitlines(): 
    if '#DIV/0!' not in line: 
      new_file.write(line) 
new_file.close() 
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's)更安全!

  • with语句替换try和catch。它也 块后自动关闭文件。正如你可以看到,它也可以嵌套:你可以用一个 with声明打开几个文件。
+0

一个简短的描述将会与新手有很长的路要走。 –

+0

完成!我修好了我的懒惰 –