2015-02-12 53 views
0

这适用于较小的文本文件,但不适用于较大的文本文件。 (100,000行) 如何优化大型文本文件? 对于fileA中的行,如果fileB中的regexPattern ==行将fileA中的(整行)行写入fileC。Python:将一个文本文件中的正则表达式与另一个文本文件中的行进行比较

import re 

with open('fileC.txt', 'w') as outfile: 
    with open('fileA.txt', 'rU') as infile1: 
     for line1 in infile1: 
      y = re.findall(r'^.+,.+,(.+\.[a-z]+$)', line1) 
       with open('fileB.txt', 'rU') as infile2: 
        for line2 in infile2: 
         if line2.strip() == y[0]: 
          outfile.write(line1) 
+1

Ok.But是什么这个问题? – Daenarys 2015-02-12 07:06:51

+0

对于文件A中的每一行,您都要循环遍历文件B中的每一行。如果A中有100,000行,B中有100,000行,则您正在执行100亿次操作。这将需要一段时间... – 2015-02-12 07:07:28

+0

谢谢。增加了一个问题。 – Woolwit 2015-02-12 07:21:08

回答

0

最直接的优化是阅读fileB.txt一次到字符串缓冲区,然后应用测试对匹配的表达式到该字符串缓冲区。您目前正在打开并读取该文件,每行fileA.txt

看来你的正则表达式会选出符合模式的整行,即它以^开头,并以$结尾。在这种情况下,一个更完整的解决方案将同时加载fileA.txtfileB.txt到使用readlines()阵列,这些阵列进行排序,然后取过两个文件,一个单程有两个柜台,如:

# Details regarding the treatment of duplicate lines are ignored 
# for clarity of exposition. 
rai = sorted([7,6,1,9,11,6]) 
raj = sorted([4,6,11,7]) 
i, j = 0, 0 
while i < len(rai) and j < len(raj): 
    if rai[i] < raj[j]: i += 1 
    elif rai[i] > raj[j]: j += 1 
    else: 
     # I used mod in lieu of testing for your regex 
     # since you didnt supply data 
     if mod(rai[i],2): print rai[i] 
     i, j = i + 1, j + 1 
+0

谢谢。正则表达式匹配fileA中整行内的一个模式。当该模式在fileB中匹配时,所需的结果是从fileA写入整行(而不仅仅是匹配的模式)。 – Woolwit 2015-02-12 07:30:01

+0

没问题。为了跟踪'fileA'中的整行,你可以更新上面的代码来使'rai'成为一个匹配数组。根据重复项,您可能还需要从匹配到匹配的行的散列。您仍然想对'fileB'进行排序以删除O(n^2)操作。 – Leo 2015-02-12 08:10:55

相关问题