在Python中连接流
- 我有 Python 3.3。
- 我有一个来自 urllib3 的 Response 对象(它有一个
stream()
方法,这个方法返回一个生成器)。 - 我有一个文件,想把数据写入这个文件。
那么,最符合 Python 风格的方法是什么,将(1)中的数据写入(2)呢?我可以用列表推导式做一些类似的事情:
with http.request_encode_url('GET', …, {'param1': value1}) as response:
with open(path, 'wb') as fp:
[fp.write(piece) for piece in response.stream(decode_content=True)]
但是对于这么常见的操作,这看起来太手动了。
2 个回答
1
列表推导式并不是一种常见的用法,因为它们是用来生成列表的。也就是说,生成的列表应该是有意义的,而不是那些从来不被使用、只是为了产生副作用而创建的列表。
你可以直接使用文件对象的 writelines()
方法:
with http.request_encode_url('GET', …, {'param1': value1}) as response:
with open(path, 'wb') as fp:
fp.writelines(response.stream(decode_content=True))
1
正确的解决方案是这样的(感谢@Blackjack的提示):
from shutil import copyfileobj
from urllib3 import HTTPConnectionPool
_http = HTTPConnectionPool(host='www.example.org', port=80)
response = _http.request_encode_url(
'GET', 'http://www.example.org/',
{'param1': value1},
preload_content=False, decode_content=True
)
with open('output.html', 'wb') as fp:
copyfileobj(response, fp)
注意:preload_content=False
这一点很重要。否则,返回的结果会是一个空的字节串。