【发布时间】:2019-09-29 19:55:03
【问题描述】:
我正在使用以下代码从 gmail 附件下载 csv 文件。生成的输出文件看起来像 ^I delimited,我不确定如何将其更改为其他分隔符,以便可以将其加载到 pandas 数据框中。
message = service.users().messages().get(userId=user_id, id=msg_id).execute()
for part in message['payload'].get('parts', ''):
if part['filename']:
file_name = part['filename']
att_id = part['body']['attachmentId']
att = service.users().messages().attachments().get(userId=user_id, messageId=msg_id,
id=att_id).execute()
data = att['data']
file_data = base64.urlsafe_b64decode(data.encode('UTF-8'))
with open(path, 'wb') as f:
f.write(file_data)
输出文件内容如下所示 - 位置 ID^I处理的货币代码^I外部 MID^IDBA 名称
编辑 1: 现在我使用制表符作为分隔符,但在将文件读入数据框时出现不同的错误。也许,它与 urlsafe_b64decode 或 data.encode('UTF-8') 有关,但我无法理解。 gmail 中的实际附件文件是制表符分隔文件。
UnicodeDecodeError: 'utf-8' 编解码器无法在位置解码字节 0xff 0:无效的起始字节
【问题讨论】:
-
实际的列名是 Location ID、Processed Currency Code、External MID、DBA Name
-
您可以在使用 pandas 读取 csv 时指定分隔符:
pd.read_csv(filename, sep='^|') -
^I是另一种表示制表符的方式,因此这很可能是制表符分隔的文件。有关如何加载,请参阅欺骗目标。 -
@Erfan - 我试过了,但它无法在文件中找到 ^I 并将所有内容放在一个列中
标签: python pandas base64 gmail-api base64url