提问人:Ilya Dubrov 提问时间:11/10/2023 最后编辑:Ilya Dubrov 更新时间:11/10/2023 访问量:34
如何提取 csv 并将其组合到 python 中的数据帧中,并使用 gmail 的 oauth 身份验证?
How extract csv's and combine to dataframe in python with oauth autentification from gmail?
问:
我是一家小型移动营销公司的初级分析师。我最近接到了一个艰巨的任务:编写一个函数,从我们的一个工作 gmail 帐户中提取一段时间内从邮件中提取 csv(并将它们组合到一个数据帧中)。上一个函数使用 imaptools 库接收 csv,这需要密码。但是,出于安全原因,密码必须定期更新,这很不方便。
我在我的 Google 帐户上创建了一个应用程序,连接了 gmail API,创建了一个 Oauth 客户端 ID 并通过报告帐户登录,收到了一个令牌。但是,我在编写函数时遇到了很大的问题。这是我写的一段代码。msg_ids 变量返回所需 ID 的正确列表。但下一步该怎么做呢?
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
CLIENT_ID = 'default.com'
CLIENT_SECRET = 'credentials.json'
creds = Credentials.from_authorized_user_file('token.json')
service = build('gmail', 'v1', credentials=creds)
results = service.users().messages().list(userId='default.com', q='has:attachment filename:csv').execute()
messages = results.get('messages', [])
msg_ids = [msg['id'] for msg in messages]
Chat GPT 为我提供了以下一段代码,但它不起作用
def get_messages(service, start_date, end_date):
start_datetime = datetime.strptime(start_date, '%Y-%m-%d').isoformat() + 'Z'
end_datetime = datetime.strptime(end_date, '%Y-%m-%d').isoformat() + 'Z'
query = f'after:{start_datetime} before:{end_datetime}'
messages = service.users().messages().list(userId='me', q=query).execute()
return messages.get('messages', [])
def get_attachments(service, message_id):
message = service.users().messages().get(userId='me', id=message_id).execute()
parts = message['payload']['parts']
attachments = []
for part in parts:
if 'filename' in part:
file_data = service.users().messages().attachments().get(userId='me', messageId=message_id, id=part['body']['attachmentId']).execute()
file_data = file_data['data']
file_data = base64.urlsafe_b64decode(file_data.encode('UTF-8'))
filename = part['filename']
attachments.append((filename, file_data))
return attachments
def create_dataframe(attachments):
df = pd.DataFrame()
for filename, data in attachments:
if filename.endswith('.csv'):
temp_df = pd.read_csv(io.BytesIO(data))
df = df.append(temp_df, ignore_index=True)
return df
注意:我期望有一个函数,可以从 gmail 中提取任意日期范围的 csvs 并将它们组合到一个数据帧中。
答: 暂无答案
评论
get_messages
query = f'has:attachment filename:csv after:{start_datetime} before:{end_datetime}'
query = f'after:{start_datetime} before:{end_datetime}'