【问题标题】:Parsing big text file using regex使用正则表达式解析大文本文件
【发布时间】:2013-08-13 05:44:22
【问题描述】:

我有一个巨大的文本文件 (1 GB),其中每个“行”都由 ## 分隔。
例如:

## sentence 1 ## sentence 2
## sentence 3

我正在尝试按照##分隔打印文件。

我尝试了以下代码,但是 read() 函数崩溃了(因为文件的大小)。

import re

dataFile = open('post.txt', 'r')
p = re.compile('##(.+)')

iterator = p.finditer(dataFile.read())
for match in iterator:
    print (match.group())

dataFile.close()

有什么想法吗?

【问题讨论】:

  • 发布预期输出和小样本输入。

标签: python regex text


【解决方案1】:

您可以使用islice。

from itertools import islice

file = open('file.txt', 'r')
while True:
  slice = islice(file, buffer)
  to_process = []
  for line in slice:
    to_process.append(line)
  if not to_process:
    break
  #process to_process list
file.close()

buffer 是您一次要读取的行数(您必须定义 int)。

【讨论】:

    【解决方案2】:

    这将以块(chunksize 字节)读取文件,从而避免与一次读取过多文件相关的内存问题:

    import re
    def open_delimited(filename, delimiter, *args, **kwargs):
        """
        http://stackoverflow.com/a/17508761/190597
        """
        with open(filename, *args, **kwargs) as infile:
            chunksize = 10000
            remainder = ''
            for chunk in iter(lambda: infile.read(chunksize), ''):
                pieces = re.split(delimiter, remainder + chunk)
                for piece in pieces[:-1]:
                    yield piece
                remainder = pieces[-1]
            if remainder:
                yield remainder
    
    filename = 'post.txt'
    for chunk in open_delimited(filename, '##', 'r'):
        print(chunk)
        print('-'*80)
    

    【讨论】:

    • 有点矫枉过正,因为我认为他的正则表达式从不跨越行边界,但仍然是一个有用的工具。
    • 逐行读取大文件太慢了。分块处理文件会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多