我正在尝试使用请求post将msgpack编码值发送到服务器,该请求发送到一个插入rest端点,该端点接受序列化的字节流作为输入。但是这些值似乎没有正确地到达那里,因为我看到没有值被插入到表中。我以前从来没有尝试过,所以请原谅我的无知。下面是我正在做的事情:
buf = io.BytesIO()
for rows in dataframe:
buf.write(msgpack.packb(rows))
response = requests.post(url, data=buf, verify=False)
try:
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print('Error fetching response using requests')
发布于 2021-05-06 00:07:23
每当我写入缓冲区时,指针总是指向缓冲区的末尾,等待新的写入。所以,当我传递data=buf
时,这将进行一个不带值的插入。解决方案是执行buf.seek(0)
,然后将data=buf
作为参数传递,或者简单地传递data=buf.seek(0)
因此,下面的方法是可行的:
for rows in dataframe:
buf = io.BytesIO()
buf.write(msgpack.packb(rows))
buf.seek(0)
response = requests.post(url, data=buf, verify=False)
try:
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print('Error fetching response using requests')
发布于 2021-05-06 00:13:46
扩展您的答案,建议使用with块,以便在发生异常时修复内存泄漏。
for rows in dataframe:
with io.BytesIO(msgpack.packb(rows)) as buf:
buf.seek(0)
response = requests.post(url, data=buf, verify=False)
try:
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print('Error fetching response using requests')
发布于 2021-05-06 00:19:14
也可以在创建BytesIO
对象时添加初始数据,这样就不必调用seek
>>> import io
>>> buf = io.BytesIO(b"test")
>>> buf.tell()
0
>>> buf.read()
b'test'
>>> buf.tell()
4
https://stackoverflow.com/questions/67375006
复制相似问题