【发布时间】:2019-01-13 18:35:23
【问题描述】:
我正在尝试将大型 .txt 文件全部读入内存(一次一个)以选择随机行,直到满足某些条件。我不能使用readlines() 或linecache.getline() 或类似的,因为文件的行由\n\n 而不是\n 分隔。 (在\n 上拆分会导致奇怪的半句等。)理想情况下,我也不想将数据拆分成块,以避免从文件的特定部分过度采样。目前,当我尝试将文件加载到内存中并使用 read().split('\n\n') 沿着文件的分隔符分隔时,程序会因
OSError: [Errno 22] 无效参数
我只是运气不好,还是有解决方法? RAM 不是问题。
编辑:我刚刚尝试使用 Python 2.7.10 和相同的 read().split('\n\n') 将文件加载到内存中,它工作正常,没有错误。所以我想我的问题应该更具体:Python 3+ 是否有解决方法?
EDIT2,根据 Ivan 的坚持:您可以使用以下代码复制我的问题
with open('file_larger_than_2gb.txt', 'r') as f:
source = f.read().split('\n\n')
在 Python 2 中运行良好,在 Python 3 中触发 OSError
【问题讨论】:
-
请将您的代码升级到minimal reproducible example -- 没有它,就无法说出导致错误的原因。
-
触发错误是因为 .txt 文件大小为几 GB。这是一个已知问题(请参阅:bugs.python.org/issue25626)。我不是在问导致错误的原因,而是在问是否有解决方法。
-
我坚持我的声明。顺便说一句,这里没有提到
zlib(这是该错误所特有的),所以我非常怀疑这是原因。 -
好的,再次更新我的问题
-
如果我使用
encoding='latin1'打开它,则在 Python 3.6.5 win64 上获得 2,5GB 文件的 WFM。所以这一定是你的文件的问题 - 可能是编码问题,或者其他东西正在使用文件或其他东西。