如何修复OSError:[Erno 22]无效参数



问题:获取错误代码OSError:[Erno 22]运行我的代码时无效参数:

代码的预期用途:使用python从gmail中的一个发送者下载所有附件。

要下载的文件类型:.DBF文件

文件的实际名称:C:\SOMETHING\SOMETHING.DBF(旧路径是文件名称的一部分(

脚本:

import os
import traceback
from imbox import Imbox 
host = "imap.gmail.com"
username = "USER1@gmail.com"
password = 'PASSWORD'
download_folder = r'C:UserDataUSERFOLDERFOLDER'
if not os.path.isdir(download_folder):
os.makedirs(download_folder, exist_ok=True)

mail = Imbox(host, username=username, password=password, ssl=True, ssl_context=None, starttls=False)
messages = mail.messages(unread=True, sent_from='USER2@gmail.com')

for (uid, message) in messages:
mail.mark_seen(uid) # optional, mark message as read
for idx, attachment in enumerate(message.attachments):
try:
att_fn = attachment.get('filename')
download_path = f"{download_folder}/{att_fn}"
print(download_path)
with open(download_path, "wb") as fp:
fp.write(attachment.get('content').read())
except:
print(traceback.print_exc())
mail.logout()

错误消息:

C:UserDataUSERFOLDERFOLDER/C:SOMETHINGSOMETHING.DBF
Traceback (most recent call last):
File "c:UserDataSOMETHING.py", line 29, in <module>
with open(download_path, "wb") as fp:
OSError: [Errno 22] Invalid argument: 'C:\UserData\USER\FOLDER\FOLDER/C:\SOMETHING\SOMETHING.DBF'
None

问题:如何使此脚本工作?

您需要从作为附件路径列出的完整路径中分离出文件名:

for (uid, message) in messages:
mail.mark_seen(uid) # optional, mark message as read
for idx, attachment in enumerate(message.attachments):
try:
# Here
_, att_fn = os.path.split(attachment.get('filename'))
download_path = f"{download_folder}/{att_fn}"
print(download_path)
with open(download_path, "wb") as fp:
fp.write(attachment.get('content').read())
except:
print(traceback.print_exc())

您需要设置OpenOptions以启用"读取"。我猜错误"未指定打开选项操作">

我有

let r = OpenOptions::new().open(filename);

并将其更改为

let r = OpenOptions::new().read(true).open(filename);

解决了这个问题

最新更新