如何在Python中读取100GB的单行文本文件?

2024-05-14 15:26:11 发布

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

我在Windows平台上使用python3。由于文件读取器的默认行为是逐行使用文件,因此我很难处理只有一行的100GB文本文件。你知道吗

我知道一些解决方案,比如this,它引入了一个自定义的记录分隔符,用\n替换一个频繁的字符;但是我想知道,我是否可以只通过Python使用和处理我的文件?你知道吗

我只有8GB的内存。我的档案是销售记录(包括商品、价格、买家等)。我对文件的处理主要是编辑价格数字。记录之间用|字符分隔。你知道吗


Tags: 文件内存windows记录读取器价格平台档案
2条回答

如果您运行的是64位操作系统,那么您可以^{}导入整个文件,并让您的操作系统在后台为您进行读取。mmaped文件大多与bytearray呈现相同的接口,因此可以执行以下操作:

import mmap

with open('largefile.txt', 'rb') as fd:
    buf = mmap.mmap(fd.fileno(), 0, access=mmap.ACCESS_READ)

然后您就可以使用buf作为一个普通的bytearray,像这样的操作来迭代您的分隔符:

def split_sep(buf, sep=b'|'):
  pos = 0
  while True:
    end = buf.find(sep, pos)
    if end == -1:
       break
    yield buf[pos:end]
    pos = end + 1
  yield buf[pos:]

但这只是一个演示。你可能想做一些更复杂的事情,也许在yield等之前从字节解码

# !/usr/bin/python3
import os, sys

# Open a file
fd = os.open("foo.txt",os.O_RDWR)

# Reading text
ret = os.read(fd,12)
print (ret.decode())

# Close opened file
os.close(fd)
print ("Closed the file successfully!!")

或者

with open(filename, 'rb') as f:
    while True:
        buf = f.read(max_size)
        if not buf:
            break
        process(buf)

或者

from functools import partial

with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), b''):
        do_something()

相关问题 更多 >

    热门问题