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



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

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

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

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

任何指示将不胜感激!此脚本已成为我业务的关键组成部分,它可以自动化我们的报告流程,并明显减少了各方面的工作量。

问候

尼廷

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

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

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

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

最新更新