![](/img/trans.png)
[英]Is there a really efficient (FAST) way to read large text files in 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.