问题:获取错误代码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);
解决了这个问题