txt约为22,000行,约为3.5MB。它中有很多重复的行。我只是想删除重复的行以及一些包含不需要的特定字符串的行。
我的方法是使用readlines()方法将文件读入大列表,然后使用read()方法将文件作为大字符串读取。迭代列表,计算出现次数,用“”(空字符串)替换该行。我花了10分钟才完成这份工作?!
有没有快速的方法来做到这一点?
非常感谢!
答案 0 :(得分:3)
list(set(line for line in file.readlines()
if 'badstring' not in line
and 'garbage' not in line))
此外,正则表达式可能比多个not in
测试更快。
答案 1 :(得分:3)
我几乎总是使用生成器进行文件处理。这使代码快速,易于修改,并且易于测试。
首先,构建一个删除重复项的生成器:
def remove_duplicates(seq):
found = set()
for item in seq:
if item in found:
continue
found.add(item)
yield item
有效吗?
>>> print "\n".join(remove_duplicates(["aa", "bb", "cc", "aa"]))
aa
bb
cc
显然是这样。接下来,创建一个函数,告诉您行是否正常:
def is_line_ok(line):
if "bad text1" in line:
return False
if "bad text2" in line:
return False
return True
这有用吗?
>>> is_line_ok("this line contains bad text2.")
False
>>> is_line_ok("this line's ok.")
True
>>>
现在我们可以将remove_duplicates
和itertools.ifilter
与我们的函数一起使用:
>>> seq = ["OK", "bad text2", "OK", "Also OK"]
>>> print "\n".join(remove_duplicates(ifilter(is_line_ok, seq)))
OK
Also OK
此方法适用于任何返回字符串的迭代,包括文件:
with open(input_file, 'r') as f_in:
with open(output_file, 'w') as f_out:
f_out.writelines(remove_duplicates(ifilter(is_line_ok, f_in)))
答案 2 :(得分:0)
goodLines = set()
badString = 'bad string'
with open(inFilename, 'r') as f:
for line in f:
if badString not in line:
goodLines.add(line)
# and let's output these lines (sorted, unique) in another file...
with open(outFilename, 'w') as f:
f.writelines(sorted(goodLines))