python-requests可以直接获取url到磁盘上的文件句柄,比如curl吗?

Posted

技术标签:

【中文标题】python-requests可以直接获取url到磁盘上的文件句柄,比如curl吗?【英文标题】:can python-requests fetch url directly to file handle on disk like curl? 【发布时间】:2013-07-30 17:09:57 【问题描述】:

curl 有一个选项可以直接在磁盘上保存文件和头数据:

curl_setopt($curl_obj, CURLOPT_WRITEHEADER, $header_handle);
curl_setopt($curl_obj, CURLOPT_FILE, $file_handle);

python-requests 有同样的能力吗?

【问题讨论】:

你检查过这个吗? ***.com/questions/2776794/help-with-curl-in-python 或者这个:***.com/questions/14114729/… 【参考方案1】:

据我所知,requests 不提供将内容保存到文件的功能。

import requests

with open('local-file', 'wb') as f:
    r = requests.get('url', stream=True)
    f.writelines(r.iter_content(1024))

见request.Response.iter_content documentation。

iter_content(chunk_size=1, decode_unicode=False)

迭代响应数据。当 stream=True 设置在 请求,这避免了一次将内容读入内存大 回应。块大小是它应该读入的字节数 记忆。这不一定是返回的每个项目的长度 可以进行解码。

【讨论】:

这是否意味着如果我请求一个大文件,如果介质不支持足够快的写入,它会全部加载到内存中? @rsk82,不,此代码不会立即将内容读入内存。查看添加的内容。【参考方案2】:

如果您保存的不是文本文件,请不要使用f.writelines()。而是使用以下之一:

import requests
try:
    r = requests.get(chosen, stream=True)
except Exception as E:
    print(E)
    # handle exceptions here.
# both methods work here...
with open(filepath, 'wb') as handle:
    for block in r.iter_content(1024):
        handle.write(block)
# or...
import shutil                    
with open(filepath, 'wb') as handle:
    shutil.copyfileobj(r.raw, handle)

shutil 在处理丢失的文件夹或递归文件复制等方面更加灵活。它允许您从请求中保存原始数据,而不必担心块大小等等。

【讨论】:

以上是关于python-requests可以直接获取url到磁盘上的文件句柄,比如curl吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python-Requests

python-requests模块

python-requests模块

python-requests模块

python-requests模块

python-requests 发出 GET 而不是 POST 请求