Python文件读取“int too large to convert to C long”

3
在我的(假设是64位Windows,64位2.7 Python)安装中,文件读取函数使用的是4字节c_long(有符号长整型)。 我测试了基本的Python文件读取函数,我不能传递超过最大有符号长整数值(2,147,483,647)的偏移量。不确定这是由于我的Python安装存在问题还是这确实是Python从文件中读取的最大限制...
以下是我的测试代码:
import sys
import platform

inFileName = r'C:\Projects\Tampa\LASPY_EVLR\LAS_DATA\input\Large_LAS\20505.las'
bit32_offset_signedlong = 2147483647

print("python version: " + sys.version)
print("platform: " + str(platform.architecture()))
print("------------------------------")

fileref = open(inFileName, "r")

print("starting 32bit max read")
datpart_32bitmax = fileref.read(bit32_offset_signedlong)
print("------------------------------")

print("starting 32bit max plus one read")
datpart_32bitmaxplus1 = fileref.read(bit32_offset_signedlong + 1)
print("------------------------------")

这会产生如下输出:
python version: 2.7.12 |Continuum Analytics, Inc.| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)]
platform: ('64bit', 'WindowsPE')
------------------------------
starting 32bit max read
------------------------------
starting 32bit max plus one read
Traceback (most recent call last):
  File "C:\Projects\Tampa\LASPY_EVLR\check_clong.py", line 18, in <module>
    datpart_32bitmaxplus1 = fileref.read(bit32_offset_signedlong + 1)
OverflowError: Python int too large to convert to C long
Press any key to continue . . .

这正常吗?我以为Python可以读取“无限”文件大小(仅受可用RAM和OS位数限制),如此处所讨论的: Python可以打开的文件的最大大小? 需要澄清的是,当使用read方法的offset参数时才会出现此问题。我可以读写比32位带符号整数大小还大的文件,只有在尝试使用读取偏移量参数读取文件的一部分时才会出现溢出错误。我的最终目标是在非常大的(6GB)文件末尾附加一些数据。
我的Python安装有问题吗?如果是这样,也许有什么方法可以解决这个问题...

尝试以二进制方式打开文件?rb - Wajahat
刚试了一下,和预期一样没有变化。 - Andrew
1个回答

2
这是因为你调用的函数是建立在需要32位偏移值的C函数之上。Python整数没有这个范围限制,但C函数有。
另外请注意,如果你读取的文件长度超过2GB,那么读操作会指定读取最多2GB的数据。你准备好处理一个大小超过2GB的字符串吗?

我正在使用laspy库读取一个非常大的LIDAR LAS格式数据文件(6GB)。我认为laspy使用numpy mmap来处理从LAS数据中读取和写入非常大的点数据数组。这段代码适用于约800MB的测试文件,但在6GB的文件上失败了... - Andrew
这将与文件大小限制为2GB保持一致,但这种行为不受Python控制。 - holdenweb
那么有什么解决方法吗?除非我可以使用numpy mmap来读取文件的部分,否则我就没有运气了吗? - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接