如何打开一些无限的文件,以便我可以在请求中发送它们?

时间:2018-05-23 21:02:14

标签: python

我需要获取用户目录的内容并在请求中发送它们。不幸的是我无法修改我正在提出请求的服务,因此我无法压缩所有文件并发送,我必须发送所有文件。

文件总大小有限制,但文件数量不受限制。不幸的是,一旦我尝试打开太多,Python就会出错:[Errno 24] Too many open files。这是我目前的代码:

files_to_send = []
files_to_close = []
for file_path in all_files:
    file_obj = open(file_path, "rb")
    files_to_send.append(("files", (file_path, file_obj)))
    files_to_close.append(file_obj)

requests.post(url, files=files_to_send)

for file_to_close in files_to_close:
    file_to_close.close()

根据我的情况,有没有办法绕过这个打开的文件限制?

1 个答案:

答案 0 :(得分:1)

您可以一次发送一个文件吗?或者也许可以分批发送?您可以在此处增加允许打开文件的数量:

IOError: [Errno 24] Too many open files:

但总的来说这很挑剔,不推荐。

您可以批量发送请求,ala:

BATCH_SIZE = 10 # Just an example batch size
while len(all_files) > 0:
    files_to_send = []
    while len(files_to_send) < BATCH_SIZE:
        files_to_send.append(all_files.pop())
        file_obj = open(file_path, "rb")
    requests.post(url, files=files_to_send)
    for f in files_to_send:
        f.close()

这将一次批量发送10个文件。如果一个人一次工作:

for file in all_files:
    with open(file, "rb") as outfile:
        requests.post(url, files=[outfile])

一次打开​​太多文件通常是不好的做法。