文件处理

在Pycrl 7.19.0.3及以下, CURLOPT_READDATACURLOPT_WRITEDATACURLOPT_WRITEHEADER 选项接受文件对象并直接传递基础C库 FILE 指向libcurl的指针。

python 3不再将文件实现为C库 FILE 物体。在pycurl 7.19.3及更高版本中,当在python 3上运行时,这些选项作为对 CURLOPT_READFUNCTIONCURLOPT_WRITEFUNCTIONCURLOPT_HEADERFUNCTION 分别以python文件对象的write方法为参数。因此,任何类似于python文件的对象实现 read 方法可以传递到 CURLOPT_READDATA 以及实现 write 方法可以传递到 CURLOPT_WRITEDATACURLOPT_WRITEHEADER 选项。

在Python2上运行pycurl 7.19.3及更高版本时,传递的旧行为 FILE 当将一个真正的文件对象赋给 CURLOPT_READDATACURLOPT_WRITEDATACURLOPT_WRITEHEADER 选项。为了与Python3行为保持一致,这些选项还接受实现 readwrite 方法(视情况而定)作为参数,在这种情况下,使用python 3代码路径将这些选项转换为 CURLOPT_*FUNCTION 选项调用。

作为参数提供给pycurl的文件 CURLOPT_READDATACURLOPT_WRITEDATACURLOPT_WRITEHEADER 必须以二进制模式打开以进行读或写。以文本模式打开的文件(无 "b" 旗到 open() )期望字符串对象,从pycurl读取或写入对象将失败。同样,当通过时 f.write 打开文件的方法 CURLOPT_WRITEFUNCTIONCURLOPT_HEADERFUNCTIONf.readCURLOPT_READFUNCTION ,文件必须以二进制模式打开。