如何遍历由分号分隔的非常大的文本文件?

2024-05-19 05:07:09 发布

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

如果我想逐行遍历文本文件,下面是我的方法:

for curr_line in open('my_file.txt', 'r').readlines()
    print '|' + curr_line + '|'

如果我想遍历基于分号分隔符的文本,下面是我的方法:

for curr_line in open('my_file.txt', 'r').read().split(';')
    print '|' + curr_line + '|'

如果我想逐行遍历一个非常大的文本文件,我是这样做的:

for curr_line in open('my_file.txt', 'r').xreadlines()
    print '|' + curr_line + '|'

但是如何遍历基于分号分隔符的非常大的文本文件呢?它是7+千兆字节,所以我无法将整个内容读入内存。你知道吗

下面是示例输入文件my_file.txt

AAAA;BBBBB
BB;CCC;
DDDDD
D
D;
EEEE;F

以下是我希望看到的基于上述代码段的输出:

|AAAA|
|BBBBB
BB|
|CCC|
|DDDDD
D
D|
|EEEE|
|F|

Tags: 方法intxtformylineopenfile
2条回答

方法.readlines()将整个文件读入一个列表。对于7GB文件,这可能不可行。你知道吗

在添加的示例中,您可以使用mmap和正则表达式进行整个文件的正则表达式匹配,而无需加载整个文件:

import re 
import mmap 

with open(fn,'r+b') as f_in:
    mm = mmap.mmap(f_in.fileno(), 0)    
    for m in re.finditer('([^;]*)', mm):
        txt=m.group(1)
        if txt:
            print('|{}|'.format(txt))

例如,打印:

|AAAA|
|BBBBB
BB|
|CCC|
|
DDDDD
D
D|
|
EEEE|
|F|

下面是一个“reader”对象,它将从文件中读取块(大小由您选择),并在找到块时发出分号分隔的项:

class MyReader:
    def __init__(self, handle, delim, read_size=512):
        self.handle = handle
        self.delim = delim
        self.read_size = read_size


    def __iter__(self):
        buffer = []
        while True:
            block = self.handle.read(self.read_size)
            if not block: break     # Reached EOF

            while block:
                (before, sep, block) = block.partition(self.delim)
                buffer.append(before)

                if sep:             # Separator was found, yield the buffer
                    yield ''.join(buffer)
                    buffer = []

        # We broke free, flush the buffer and return (explicit)
        yield ''.join(buffer)
        return

例如,您可以使用:

with open('file.txt') as f:
    reader = MyReader(f, ';')

    for chunk in reader:
        print(repr(chunk))

输出:

'AAAA'
'BBBBB\nBB'
'CCC'
'\nDDDDD\nD\nD'
'\nEEEE'
'F'

相关问题 更多 >

    热门问题