内存限制在海量文本文件上使用正则表达式

时间:2015-09-22 15:43:40

标签: python regex

我有一个以下格式的文本文件:

('1', '2')
('3', '4')
     .
     .
     .

我想让它看起来像这样:

1 2
3 4
etc...

我一直在尝试使用python中的re模块执行此操作,将re.sub命令链接在一起,如下所示:

for line in file:
    s = re.sub(r"\(", "", line)
    s1 = re.sub(r",", "", s)
    s2 = re.sub(r"'", "", s1)
    s3 = re.sub(r"\)", "", s2)
    output.write(s3)
output.close()

在我接近输出文件的末尾之前似乎工作得很好;然后它变得不一致并停止工作。我认为这是因为我正在处理的文件的大小; 300MB或大约1200万行。

任何人都可以帮我确认我的内存不足吗?或者如果是别的什么?合适的替代方案,或解决方法?

4 个答案:

答案 0 :(得分:2)

您可以使用更简单的正则表达式来简化您的代码,该正则表达式可以找到输入中的所有数字:

import re
with open(file_name) as input,open(output_name,'w') as output:
for line in input:
       output.write(' '.join(re.findall('\d+', line))
       output.write('\n')

答案 1 :(得分:1)

为什么不将它们加载为ast.literal_eval的python元组。另外,不是手动打开和关闭文件,而是可以使用with语句来关闭块末尾的文件:

With open(file_name) as input,open(output_name,'w') as output:
    for line in input:
       output.write(','.join(ast.literal_eval(line.strip())))

答案 2 :(得分:1)

我会使用namedtuple来获得更好的效果。代码变得更具可读性。

# Python 3

from collections import namedtuple
from ast import literal_eval
#...

Row = namedtuple('Row', 'x y')
with open(in_file, 'r') as f, open(out_file, 'w') as output:
    for line in f.readlines():
        output.write("{0.x} {0.y}".
                     format(Row._make(literal_eval(line))))

答案 3 :(得分:0)

这是没有re模块的一种方法:

in_file = open(r'd:\temp\02\input.txt', 'r')
out_file = open(r'd:\temp\02\output.txt', 'w')

for line in in_file:
    out_file.write(line.replace("'", '').replace('(', '').replace(', ', ' ').replace(')', ''))
out_file.close()