使用Oauth2.0 gmail API

时间:2017-05-29 02:26:06

标签: python csv gmail gmail-api

我正在从gmail下载csv报告的csv附件。我使用的是Python 3.6.1和Oauth 2.0 gmail API。

csv文件中有一个日期列,我将其格式硬编码为'%Y-%m-%d'。

当我下载csv附件并将其作为文本文件检查时,大多数情况下,我得到如下预期日期格式(前2行的前3列) -

"date","advertiser","advertiser_id", ...
"2017-05-27","Swiss.com India (UK)","29805", ...

然而,有时,csv文件中的引号丢失了 - 我接着将其作为 -

date,advertiser,advertiser_id, ...
27/05/2017,Swiss.com India (UK),29805, ...

在这种情况下,日期模式结果为'%d /%m /%Y'。

使用未加引号的日期下载文件时没有明显的模式。大多数情况下,如果我删除下载的文件并重新运行我的脚本,则会重新下载引用的附件。

有没有办法设置附件下载,以便以引用格式下载日期列?或者有没有办法确保当我读取csv(使用csv.reader)时,我总是以某种格式获取日期列?

这里给出了我用来下载附件的具体方法 -
https://developers.google.com/gmail/api/v1/reference/users/messages/attachments/get(Python版)。确切的代码段是 -

        # Get the body of this part and it's keys.
        part_body = part['body']
        part_body_keys = part_body.keys()
        ...
        if 'data' in part_body_keys:
            a_data = part_body['data']
        elif 'attachmentId' in part_body_keys:
            att_id = part_body['attachmentId']
            att = service.users().messages().attachments().get(
                        userId=user_id, messageId=message['id'],
                        id=att_id).execute()
            a_data=att['data']
        else:
            ...

        # Encode it appropriately and write it to the file.
        file_data = base64.urlsafe_b64decode(a_data.encode('UTF-8'))
        ...
        f = open(file_name, 'wb')
        f.write(file_data)
        f.close()

读取csv文件时的代码段是 -

infile = open(file_name, mode="r", encoding='ascii', errors='ignore')
filereader = csv.reader(infile)
date_fmt = "%Y-%m-%d"
…
for a_row in filereader:
    …
    try:
        rf_datetime = time.strptime(a_row[0], date_fmt)
    …

任何指针都将不胜感激!这个脚本已经成为我业务的一个关键组成部分,它使我们的报告流程自动化,并且明显减少了所有工作。

此致

尼丁

1 个答案:

答案 0 :(得分:0)

看起来附加的csv文件本身的格式不同(或者'data''attachmentId'之间可能存在差异?)。

可以肯定的是,您可以手动下载它们并在文本编辑器中进行检查。

至于引号:对于csv,如果引用了字段,则没有区别。仅当字段包含字段分隔符时,才需要用引号括起来。但是,由于你使用的是csv阅读器,这无关紧要。

至于日期,在阅读循环之前(在第一个数据行中)检查日期格式可能最容易,并相应地设置date_fmt(用于解析)。