gpt4 book ai didi

python - 使用请求模块打开的文件太多

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:15 25 4
gpt4 key购买 nike

我正在使用请求模块将多个文件发布到服务器,这在大多数情况下都可以正常工作。但是,当上传许多文件 >256 时,我会收到 IOError: [Errno 24] 打开的文件太多。发生此问题是因为我构建了一个包含许多文件的字典,这些文件已打开,如下面的代码所示。由于我没有关闭这些打开文件的句柄,我们看到了这个错误。这导致以下问题

  1. 有没有办法分块关闭这些文件?
  2. 请求模块是否自动关闭打开的文件?

    url = 'http://httpbin.org/post'
    #dict with several files > 256
    files = {'file1': open('report.xls', 'rb'), 'file2': open('report2.xls', 'rb')}
    r = requests.post(url, files=files)
    r.text

我现在使用的解决方法是一次上传 < 256 个文件后使用 files.clear()。我不确定这样做是否关闭了文件,但错误消失了。

请提供有关如何处理这种情况的见解。谢谢

最佳答案

这里最简单的解决方案是自己将文件读入内存,然后将它们传递给请求。请注意,作为 the docs说,“如果你愿意,你可以发送字符串作为文件接收”。那么,就这样做吧。

换句话说,不是像这样构建字典:

files = {tag: open(pathname, 'rb') for (tag, pathname) in stuff_to_send}

... 像这样构建它:

def read_file(pathname):
with open(pathname, 'rb') as f:
return f.read()
files = {tag: read_file(pathname) for (tag, pathname) in stuff_to_send}

现在您一次只能打开一个文件,保证。

这可能看起来很浪费,但实际上并非如此——如果您不这样做,requests读取您所有文件中的所有数据.*

但与此同时,让我回答您的实际问题,而不仅仅是告诉您该怎么做。


Since I do not have a handle to close these open files we see this error.

当然可以。你有一个字典,它的值是这些打开的文件。

事实上,如果您没有处理它们,这个问题发生的频率可能会低得多,因为垃圾收集器会(通常,但不一定足够健壮/可靠地计数) on) 为你打理事情。它从不这样做的事实意味着您必须能够处理它们。


Is there a way to close these files in chunks?

当然。我不知道你是怎么做这些 block 的,但大概每个 block 都是一个键列表或其他东西,你正在传递 files = {key: files[key] for key in chunk},对吧?

因此,在请求之后,执行此操作:

for key in chunk:
files[key].close()

或者,如果您像这样为每个 block 构建一个 dict:

files = {tag: open(filename, 'rb') for (tag, filename) in chunk}

... 只需这样做:

for file in files.values():
file.close()

Does requests module close the open files automatically?

没有。您必须手动完成。

在许多用例中,你永远不会这样做,因为 files 变量在请求后很快就消失了,一旦没有人引用字典,它就会很快被清理(立即,使用 CPython 并且如果没有循环;如果其中任何一个不正确,则只是“很快”),这意味着所有文件都会很快被清理,此时析构函数会为您关闭它们。但你不应该依赖它。始终明确关闭您的文件。

files.clear() 似乎起作用的原因是它在做与让 files 消失相同的事情:它迫使 dict 忘记所有文件,这会删除对每个文件的最后引用,这意味着它们将很快被清理,等等。


* 如果您没有足够的页面空间将它们全部保存在内存中怎么办?那么无论如何你不能一次发送它们。您必须发出单独的请求,或使用流式 API——我认为这意味着您还必须手动执行多部分。但是如果你有足够的页面空间,只是没有足够的实际 RAM,那么试图读取它们全部会让你陷入交换颠簸的 hell ,你可以通过将它们全部连接在磁盘上,打开巨大的文件,mmapping 段,并将其作为字符串发送...

关于python - 使用请求模块打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com