Python requests: 大内容的POST请求
我正在通过POST请求把一个CSV文件发送到服务器。
我使用了一个类似文件的对象来配合requests.post
使用。
如果CSV文件比较大,而我的内存有限,会不会出现问题?我不太确定,因为我用的这个类似文件的对象不会把整个文件都加载到内存里。
我知道有一个流式选项,但听起来这个选项更像是用来获取响应,而不是发送数据。
headers = {
'content-type': 'text/csv',
}
csvfile = '/path/file.csv'
with open(csvfile) as f:
r = requests.post(url, data=f, headers=headers)
2 个回答
3
这段话的意思是,程序不会一次性把整个文件都加载到内存里,而是会把文件分成小块,一点一点地传输。你可以在源代码中看到这个过程,具体可以查看这里。
15
使用一个打开的文件对象作为 data
参数,可以确保 requests
会为你处理数据流。
如果文件大小可以通过操作系统的文件系统确定,那么文件对象会使用一个8kb的缓冲区进行流式传输。如果无法确定文件大小,则会发送一个 Transfer-Encoding: chunked
的请求,这样数据会一行一行地发送(这个对象会被当作可迭代的对象使用)。
另一方面,如果你使用 files=
参数进行多部分的POST请求,文件会在发送之前先被加载到内存中。要进行多部分上传的流式处理,可以使用 requests-toolbelt包:
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
csvfile = '/path/file.csv'
with open(csvfile) as f:
m = MultipartEncoder(fields={'csv_field_name': ('file.csv', f, 'text/csv')})
headers = {'Content-Type': m.content_type}
r = requests.post(url, data=m, headers=headers)