我正在尝试通过 Users.messages.attachments:get 方法(1)从Gmail-API导出csv文件,并将其转换为熊猫数据框。我已经有了附件的ID和邮件的ID,一切正常。该文档说附件的主体数据是“作为base64url编码的字符串的一部分”(2),现在我想将csv文件转换为熊猫数据帧。在此post之后,我尝试了以下操作:
[...]
#get the attachment
file = service.users().messages().attachments().get(userId='me', messageId=message_id, id=attachmentId).execute()
#convert the file to a pandas data-frame.
data = file['data']
str_csv = base64.urlsafe_b64decode(data)
df = pd.read_csv(StringIO(str_csv))
print(data)
如下所示:
__5CAGUAcgBpAGMAaAB0ACAAegB1ACAAQQB1AGsAdABpAG8AbgBzAGQAYQB0AGUAbgAgAGYA_AByACAASwBhAG0AcABhAGcAbgBlAG4ACgAxAC4AIABKAGEAbgB1AGEAcgAgADIAMAAyADAAIAAtACAAMwAxAC4AIABKAGEAbgB1AGEAcgAgADIAMAAyADAACgBHAGUAcgDkAHQACQBEAG8AbQBhAGkAbgAgAGQAZQByACAAYQBuAGcAZQB6AGUAaQBnAHQAZQBuACAAVQBSAEwACQBBAG4AdABlAGkAbAAgAGEAbgAgAG0A9gBnAGwAaQBjAGgAZQBuACAASQBtAHAAcgBlAHMAcwBpAG8AbgBlAG4ACQDcAGIAZQByAHMAYwBoAG4AZQBpAGQAdQBuAGcAcwByAGEAdABlAAkAUgBhAHQAZQAgAGQAZQBy
等...
不幸的是,我收到以下错误消息:
有人知道我该如何解决这个问题或可以解释为什么它不起作用吗?
(1)参见https://developers.google.com/gmail/api/v1/reference/users/messages/attachments/get
(2)参见https://developers.google.com/gmail/api/v1/reference/users/messages/attachments
答案 0 :(得分:2)
错误的直接原因是base64.urlsafe_b64decode
返回一个字节字符串。您必须先对其进行解码,以获取要传递给StringIO
的真实字符串:
str_csv = base64.urlsafe_b64decode(data).decode('UTF16')
但是请注意:您显示的编码字符串在解码时会给出:
'Bericht zu Auktionsdaten für Kampagnen\n1. Januar 2020 - 31. Januar 2020\nGerät\tDomain der angezeigten URL\tAnteil an möglichen Impressionen\tÜberschneidungsrate\tRate der'
即:
我认为在送入read_csv
之前需要进一步处理(至少跳过一些行并设置分隔符...)