在Python中连接流

0 投票
2 回答
702 浏览
提问于 2025-04-18 14:36
  1. 我有 Python 3.3。
  2. 我有一个来自 urllib3 的 Response 对象(它有一个 stream() 方法,这个方法返回一个生成器)。
  3. 我有一个文件,想把数据写入这个文件。

那么,最符合 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 这一点很重要。否则,返回的结果会是一个空的字节串。

撰写回答