读取/写入/解析大文本文件的有效方法(python)

Ale*_*des 1 python regex parsing

说我有一个荒谬的大文本文件.我不认为我的文件会比@ 500mb大,但为了扩展性和我自己的好奇心,让我们说这是几个演出的顺序.

我的最终目标是将它映射到一个句子数组(由'?''!''.'和所有意图和目的';'分隔)和每个句子到一个单词数组.然后我将使用numpy进行一些统计分析.

这样做最具可扩展性的方法是什么?

PS:我想重写文件每行只有一个句子,但是我在尝试将文件加载到内存时遇到了问题.我知道解决方案,你在一个文件中读取数据,操纵它们,然后将它们写入另一个文件,但这对磁盘内存来说似乎效率低下.我知道,现在大多数人不会担心使用10gig的临时空间,但似乎应该有一种直接编辑文件夹头的方法.

Dav*_*d Z 5

我的第一个想法是使用流解析器:基本上你一次读取一个文件并随时进行统计分析.这通常使用HTML和XML等标记语言来完成,因此您可以在那里找到许多针对这些语言的解析器,包括在Python标准库中.一个简单的句子解析器是你自己可以写的东西; 例如:

import re, collections
sentence_terminator = re.compile(r'(?<=[.!?;])\s*')
class SentenceParser(object):
    def __init__(self, filelike):
        self.f = filelike
        self.buffer = collections.deque([''])
    def next(self):
        while len(self.buffer) < 2:
            data = self.f.read(512)
            if not data:
                raise StopIteration()
            self.buffer += sentence_terminator.split(self.buffer.pop() + data)
        return self.buffer.popleft()
    def __iter__(self):
        return self
Run Code Online (Sandbox Code Playgroud)

这只会根据需要从文件中读取数据以完成一个句子.它读取512字节块,因此无论实际文件有多大,您在任何时候都将在内存中保存少于1 KB的文件内容.

在流解析器之后,我的第二个想法是内存映射文件.这样你就可以通过换行来替换(推测)跟随每个句子终结符的空间; 之后,每个句子都会从一个新行开始,你可以打开文件并使用readline()for循环逐行浏览.但你还是要担心多行句子; 再加上,如果任何一句话终止符接空格字符,你将不得不插入一个换行符(而不是替换别的东西与它),并且可能是一个大文件效率极其低下.