繁体   English   中英

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

[英]Efficient way to read/write/parse large text files (python)

说我有一个荒唐的大文本文件。 我不认为我的文件会增长到超过500mb,但出于可扩展性和我自己的好奇心,让我们说它大约是几千字节。

我的最终目标是将其映射到句子数组(以“?”,“!”“。”分隔,并出于所有意图和目的“;”),并将每个句子映射到单词数组。 然后,我将使用numpy进行一些统计分析。

做这件事的最可扩展的方法是什么?

PS:我想重写文件以使每行只有一个句子,但是在尝试将文件加载到内存时遇到了问题。 我知道一种解决方案,其中您可以读取一个文件中的数据块,然后将它们处理,然后将它们写入另一个文件中,但这对于磁盘内存来说似乎效率很低。 我知道,当今大多数人都不会担心使用10gig的暂存空间,但是似乎应该有一种直接编辑文件夹的方法。

我的第一个想法是使用流解析器:基本上,您一次读入一个文件,然后进行统计分析。 通常使用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

这只会根据需要从文件中读取数据以完成句子。 它读取512字节的块,因此无论实际文件有多大,您一次都可以在内存中保留不到一千字节的文件内容。

在流解析器之后,我的第二个想法是对文件进行内存映射 这样,您可以遍历并用换行符替换(大概)每个句子结尾后面的空格; 之后,每个句子将从新的一行开始,您可以打开文件并使用readline()for循环逐行浏览该文件。 但是,您仍然必须担心多行句子。 另外,如果任何句子终止符后面都没有空格字符,则您必须插入换行符(而不是用换行符替换),这对于大文件而言可能效率极低。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM