2011-03-09 122 views
8

在Python,我想编写一个程序,它过滤从我的文本文件,该文件包含“苹果”,写这些行成一个新的文本文件中的行。我试过的只是在我的新文本文件中写下“苹果”一词,而我想要整行。我是一名Python初学者,请回复我的问题,因为我真的需要这个。的Python:从文本文件过滤线,包含特定单词

回答

16

使用可以得到包含使用列表理解“苹果”的所有行:

[ line for line in open('textfile') if 'apple' in line] 

所以 - 也是一个代码行 - 你可以创建新的文本文件:

open('newfile','w').writelines([ line for line in open('textfile') if 'apple' in line]) 

而且eyquem是对的:保持迭代器的速度肯定会更快并且写入更快

open('newfile','w').writelines(line for line in open('textfile') if 'apple' in line) 
+3

列表解析创建一个对象。使用生成器表达式会更好。顺便说一下,它可以写成'''writelines'(line for line in open('textfile')if'apple'in line)' – eyquem 2011-03-09 12:03:56

+0

@eyquem:好吧,我完全同意 - 对于大文件 - 它应该是更好的使用发电机,因为发电机懒洋洋的行为,从而犯规消耗那么多的内存。但是对于小文件来说,列表理解是更快的解决方案? – phynfo 2011-03-09 12:23:53

+0

@Phynfo:没......让事情作为发电机/迭代器效率高得多。该列表理解仍然是创建迭代器,然后将其填充列表,一旦完全通过该列表writelines该把它放回迭代器。 – 2015-11-04 00:46:16

1

if "apple" in line:应该管用。

8
from itertools import ifilter 

with open('source.txt','rb') as f,open('new.txt','wb') as g: 

    g.writelines(ifilter(lambda line: 'apple' in line, f)) 
5

使用生成器,这是内存高效,快速

def apple_finder(file): 
    for line in file: 
     if 'apple' in line: 
      yield line 


source = open('forest','rb') 

apples = apple_finder(source) 

我爱无脑损伤简单的解决方案,用于读取:-)

+1

函数** apple_finder(文件)**是一个函数发生器,**苹果**是一个发生器。后者做同样的工作如**的IFilter(拉姆达行:“苹果”线,F)**在两行(包括进口) – eyquem 2011-03-09 12:39:12

相关问题