2016-02-15 70 views
0

我正在寻找一些更好的方法来解析一个巨大的文件。 以下是该文件的示例。有没有更好的方法来解析python文件?

sample.txt的

'abcdefghi' 
'xyzwfg' 
'lmnop' 

外面我要找的文件在“ABC”和“XYZ”至少一次

我能找到他们,但我正在寻找一些更好的方法。 以下是我的代码

datafile = file('sample.txt') 
abc = 0 
xyz = 0 
found - True 

for line in datafile: 
     if 'abc' in line: 
      abc += 1 
      break  
for line in datafile: 
     if 'xyz' in line: 
      xyz += 1 
      break 

if (abc + xyz) >= 2: 
    print 'found' 
else: 
    print 'fail' 

我运行一个循环两次。那么有没有更好的方法来解析文件?

+1

您是否在意发现的事件总数?你使用计数器而不是真/假标志表明是的,但是使用'break'表示不。 –

回答

0

“更好”是主观的,没有提供指标来定义它。然而,一个简单的优化如下:

for line in datafile: 
    if 'abc' in line: 
     abc += 1 
    if 'xyz' in line: 
     xyz += 1 

如果实际的问题是,该文件确实是非常大的,你想一次只读取一行:

f = open('myTextFile.txt', "r") 
line = f.readline() 
while line: 
    if 'abc' in line: 
     abc += 1 
    if 'xyz' in line: 
     xyz += 1 
    line = f.readline() 

的结果这将分别获得abcxyz发生的行数。如果想法在您找到一条匹配线时立即退出,那么包括break是适当的。

+0

这正是我要回答的问题。但是请注意,这将处理**整个**文件,其中原始代码在发现一个事件后停止查找。 –

+0

确实......尽管从最初的问题来看,这是故意的还不清楚。如果是这样,为什么使用'+ ='? –

+0

逐行读取文件的惯用方法是'for line in f:'。不需要尴尬的while循环和显式调用'f.readline()'。 –

2

如果您在'abc'之前发生'xyz',您当前的代码将产生不正确的结果。在同一个循环中修复这个测试。

with open('sample.txt') as datafile: 
    abc_found = False 
    xyz_found = False 

    for line in datafile: 
     if 'abc' in line: 
      abc_found = True 
     if 'xyz' in line: 
      xyz_found = True 
     if abc_found and xyz_found: 
      break # stop looking if both found 
+0

@FredrikRosenqvist:他不寻求0或关闭并重新打开文件,所以第二个循环继续读取第一个文件停止的文件。 –

+0

@Downvoter:为什么downvote? –

相关问题