代码之家  ›  专栏  ›  技术社区  ›  Athena Vinod R

在请求中发送多部分表单数据时,是否需要使用with语句?

  •  1
  • Athena Vinod R  · 技术社区  · 6 年前

    在巨蟒的 requests documentation

    请求使上载多部分编码的文件变得简单:

    >>> url = 'http://httpbin.org/post'
    >>> files = {'file': open('report.xls', 'rb')}
    
    >>> r = requests.post(url, files=files)
    

    This question this question 同一作者使用 with 声明:

    with open('data','rb') as payload:
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        r = requests.post('https://IP_ADDRESS/rest/rest/2', auth=('userid', 'password'),
                          data=payload, verify=False, headers=headers)
    

    我的直觉是我应该经常使用 具有 使用文件时的语句;在这种情况下是否需要它?更清楚地说,我是 寻求是否使用的建议 . 我指的是与 请求 图书馆,如果我可以省略 正如文件所暗示的那样。

    3 回复  |  直到 6 年前
        1
  •  3
  •   abarnert    6 年前

    你的直觉是对的。


    没有 with payload.close() 呼叫),您不会关闭文件。

    当然总是 可能的 您调用的某个函数,将文件作为参数传递,可能 close 那个档案。但总的来说,他们不会;尤其是, requests.post f.closed 或者阅读资料。)

    files 保存保存文件对象的dict。所以在退出程序之前,文件对象一直都是可访问的。它 变成垃圾,所以它永远不会被删除,所以文件永远不会被关闭,直到你 exit

    因为您没有向文件中写入任何内容,所以这不会导致任何可怕的结果,比如当您希望缓冲区位于磁盘上时,将未刷新的数据放在缓冲区中。

    但这确实意味着你在浪费资源。操作系统内核必须为每个打开的文件保留某种结构,进程需要其他东西来引用该内核结构。如果打开数千个文件而不关闭它们,最终,其中一个表将填满,下次尝试打开文件时,会出现打开过多文件的错误。

    以及各种各样的程序 requests 这类程序需要处理数千个文件,所以这可能是一个真正的问题。

    那么,你呢 需要 具有 希望

        2
  •  1
  •   J. Blackadar    6 年前

    对。使用 with 语句为您处理关闭资源。您应该使用它来正确处理外部资源。

        3
  •  1
  •   chepner    6 年前

    files 参数可以工作,而不必太担心文件是否被关闭。更好的例子是

    with open('report.xls', 'rb') as f:
        r = requests.post(url, files={'file': f})