我正在从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)
…
任何指针都将不胜感激!这个脚本已经成为我业务的一个关键组成部分,它使我们的报告流程自动化,并且明显减少了所有工作。
此致
尼丁
答案 0 :(得分:0)
看起来附加的csv文件本身的格式不同(或者'data'
和'attachmentId'
之间可能存在差异?)。
可以肯定的是,您可以手动下载它们并在文本编辑器中进行检查。
至于引号:对于csv,如果引用了字段,则没有区别。仅当字段包含字段分隔符时,才需要用引号括起来。但是,由于你使用的是csv阅读器,这无关紧要。
至于日期,在阅读循环之前(在第一个数据行中)检查日期格式可能最容易,并相应地设置date_fmt
(用于解析)。