我从这个代码中得到这个错误。
import os
import requests
import shutil
path = "/Users/mycode/Documents/API upload/"
api_endpoint = "xxxxxx"
files = {
'file': open(p,'rb') for p in os.path.abspath(path)
}
for file in os.path.abspath(path):
response = requests.post(url=api_endpoint, files=files)
if response.status_code == 200:
print(response.status_code)
print("success!")
else:
print("did not work")
IsADirectoryError: [Errno 21] Is a directory: '/'
^这个错误是什么意思?我试着在谷歌上搜索,但仍然不明白我的情况。它与路径有关,但不确定为什么。
任何帮助!
for p in os.path.abspath(path)
并不像你想象的那样。
不遍历给定目录中的所有文件。使用操作系统。Listdir。您可以使用os.path.join将目录路径和目录内的文件名组合起来。pathlib模块有一个更容易使用的/更高级别的接口来实现所有这些。
你的代码所做的是遍历os.path.abspath(path)
返回的字符串中的所有字符。第一个字符是/
。然后尝试将其作为文件打开。这不起作用,因为/
是一个目录。
您可能希望考虑以块的形式执行此操作,因为如果您的目录内容非常大,您可能会耗尽文件描述符。
应该这样做:
from requests import post
from glob import glob
from os.path import join, isfile
DIR = '/Users/mycode/Documents/API upload/'
CHUNK = 10
API_ENDPOINT = '...'
filelist = [filename for filename in glob(join(DIR, '*')) if isfile(filename)]
for idx in range(0, len(filelist), CHUNK):
files = [('file', open(fn, 'rb')) for fn in filelist[idx:idx+CHUNK]]
post(API_ENDPOINT, files=files).raise_for_status()
for _, fd in files:
fd.close()
注意:
为了提高效率,您应该考虑为
使用多线程。