簡體   English   中英

如何在Python中讀取100GB單行文本文件?

[英]How to read a 100GB one-line text file in Python?

我在Windows平台上使用Python 3.由於文件閱讀器的默認行為是逐行使用文件,因此我很難處理只有一行的100GB文本文件。

我知道的解決方案,如引入自定義記錄分隔符與更換頻繁的字符\\n ; 但我不知道有沒有我只能通過Python使用和處理我的文件?

我只有8GB的內存。 我的檔案是銷售記錄(包括物品,價格,買家......)。 我對該文件的處理主要是編輯價格編號。 使用|將記錄彼此分開 字符。

# !/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()

如果您正在運行64位操作系統,您可以將整個文件mmap到並讓您的操作系統實際為您在后台進行閱讀。 mmap ed文件通常與bytearray呈現相同的接口,因此您可以執行以下操作:

import mmap

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

然后你可以使用buf作為普通的bytearray ,這樣的操作迭代你的seperator:

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之前從字節解碼等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM