【问题标题】:Avoiding OSError: [Errno 22] Invalid argument when read()ing large file避免 OSError:[Errno 22] 读取()大文件时参数无效
【发布时间】: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。所以这一定是你的文件的问题 - 可能是编码问题,或者其他东西正在使用文件或其他东西。

标签: python text ram


【解决方案1】:

此问题是由 macOS 10.13.6 测试版中的错误引起的。问题已在 2018 年 7 月 10 日发布的 10.13.6 的完整版本中得到修复。

【讨论】:

  • 但为什么这是 macOS 的问题?
  • 仅供参考,我在版本 10.13.3 中遇到了这个问题。
  • 而且其实更新到10.13.6后还是不行。
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
相关资源
最近更新 更多