簡體   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