删除文本文件中不包含与Python的某个字符串的行

问题描述:

我想在日志文件中形成特定用户名的引号文件。如何删除每行不包含特定用户名的行?或者,如何将包含此用户名的所有行写入新文件?删除文本文件中不包含与Python的某个字符串的行

东西沿着这条线就足够了:

newfile = open(newfilename, 'w') 
for line in file(filename, 'r'): 
    if name in line: 
     newfile.write(line) 
newfile.close() 

参见:http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

f.readlines()返回一个包含文件中的数据的所有行的列表。

读取行的另一种方法是循环遍历文件对象。这是内存高效,快速,并导致简单的代码

>>> for line in f: 
     print line 

你也可以检出使用with关键字。该文件是其整套后正常关闭的优势结束

>>> with open(filename, 'r') as f: 
...  read_data = f.read() 
>>> f.closed 
True 

with open('input.txt', 'r') as rfp: 
    with open('output.txt', 'w') as wfp: 
    for line in rfp: 
     if ilikethis(line): 
     wfp.write(line) 
+0

这是完美 – pyfunc 2010-11-30 05:12:04

with open(logfile) as f_in: 
    lines = [l for l in f_in if username in l] 
with open(outfile, 'w') as f_out: 
    f_out.writelines(lines) 

或者,如果你不想在内存中存储

with open(logfile) as f_in: 
    lines = (l for l in f_in if username in l) 
    with open(outfile, 'w') as f_out: 
     f_out.writelines(lines) 

我有点像所有的行第一个更好,但对于大文件,它可能会拖动。

+0

你并不需要缩进第二“与”在第二种情况下,出于同样的原因,你不需要在第一种情况下。 – 2010-11-30 05:49:34

+0

@Karl Knechtel我确实在做。因为在第二种情况下,我使用了一个生成器表达式,因此如果`with`语句退出,那么当生成器表达式实际得到处理时,该文件将被关闭并导致错误。尝试一下。这是我能想到的在文件处理中使用生成器表达式的唯一技巧。 – aaronasterling 2010-11-30 05:51:25

我知道你问过python,但是如果你在unix上,这是grep的一份工作。

grep name file 

如果你不是在UNIX上,以及...答案上面的伎俩:)