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

2024-06-28 19:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个荒谬的大文本文件。我不认为我的文件会增长到大约500mb,但出于可伸缩性和我自己的好奇心,假设它的大小为几GB。在

我的最终目标是将它映射到一组句子(用“?”“!”分隔)为了所有的意图和目的,';'和每一个句子到一系列的单词。然后我要用numpy进行一些统计分析。在

要做到这一点,最具伸缩性的方法是什么?在

PS:我想重写文件,使每行有一个句子,但在将文件加载到内存时遇到了问题。我知道一种解决方案,即读取一个文件中的卡盘数据,对其进行操作,然后将其写入另一个文件,但这对于磁盘内存来说似乎效率低下。我知道,现在大多数人都不会担心使用10gig的暂存空间,但似乎应该有一种直接编辑文件的方法。在


Tags: 文件数据方法内存目的numpy解决方案单词
1条回答
网友
1楼 · 发布于 2024-06-28 19:14:15

我的第一个想法是使用一个流解析器:基本上你一次读入一个文件,然后边做统计分析。这通常是用标记语言(如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字节的块读取,因此无论实际的文件有多大,您在内存中一次只能保存少于1千字节的文件内容。在

在流解析器之后,我的第二个想法是memory map文件。这样您就可以遍历并用换行符替换每个句子结束符后面的空格;之后,每个句子都将从一个新行开始,您就可以打开文件并使用readline()for循环来逐行遍历它。但是您仍然需要担心多行语句;另外,如果任何一个句子结束符后面跟一个空格字符,您就必须插入一个新行(而不是用它替换其他内容),对于一个大文件来说,这可能是非常低效的。在

相关问题 更多 >