使用Oauth2.0 gmail API下载csv文件时缺少双引号(随机)

2024-05-16 19:04:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从gmail下载csv附件,这些附件是csv报告。我使用的是python3.6.1和oauth2.0gmailapi。你知道吗

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)
    …

任何指点都将不胜感激!这个脚本已经成为我的业务的一个关键组件,它自动化了我们的报告过程,并且明显地减少了所有方面的工作量。你知道吗

敬礼

镍钛


Tags: 文件csvcomiddata附件date格式
1条回答
网友
1楼 · 发布于 2024-05-16 19:04:42

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

当然,您可以手动下载它们并在文本编辑器中检查它们。你知道吗

至于引号:对于csv来说,字段是否被引用并没有什么区别。只有当字段包含字段分隔符时,才需要用引号括起来。但既然你使用的是csv阅读器,这就不重要了。你知道吗

至于日期,在读取循环之前检查一次日期格式(在第一个数据行中),并相应地设置date_fmt(用于解析)可能是最简单的。你知道吗

相关问题 更多 >