我在Windows平台上使用Python3。由于文件阅读器的默认行为是逐行使用文件,因此我很难处理只有一行的100GB文本文件。
我知道诸如this之类的解决方案,它们引入了一个自定义记录分隔符来用\n
替换一个常用字符;但是我仍然想知道是否只能通过Python使用和处理文件?
我只有8GB的RAM。我的文件是销售记录(包括商品,价格,买家等)。我对文件的处理主要是编辑价格编号。记录之间用|
字符隔开。
答案 0 :(得分:4)
# !/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()
答案 1 :(得分:1)
如果您运行的是64位操作系统,则可以mmap
进入整个文件,并让您的操作系统实际在后台为您进行阅读。 mmap
版的文件大多与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
等操作之前从字节进行解码。