前提・実現したいこと
日々の売上情報を定型メールで受信し、受信した内容を正規化した上でcsv出力したいと考えております。csvの項目はdate(日付)、title(タイトル)、body(本文)で出力する想定です。
以下参考)
■受信するメールイメージ
(メール受信日)
4/03
(件名)
A商店
(本文)
04月01日
ペン
04月02日
消しゴム
■出力したいcsvイメージ
date | title | body |
---|---|---|
04/01 | A商店 | ペン |
04/02 | A商店 | 消しゴム |
発生している問題・エラーメッセージ
csvに書き込んだ際、本文がdataカラムに食い込んでしまう。
date | title | body |
---|---|---|
04/01 | A商店 | 04月01日 |
ペン | ||
04/02 | ||
消しゴム |
該当のソースコード
Python
1import imaplib 2import email 3import dateutil.parser 4import base64 5 6import csv 7import requests 8from bs4 import BeautifulSoup 9 10import pandas as pd 11 12# ヘッダ作成 13HEADER = ['date', 'title', 'body'] 14 15# mail文章をデータソースとして定義 16def main(): 17 gmail = imaplib.IMAP4_SSL("imap.gmail.com") 18 gmail.login("xxxxxx@gmail.com","xxxxxx") 19 gmail.select('inbox') 20 typ, [data] = gmail.search(None, "(ALL)") 21 22 # CSVへの書き込み 23 with open('sales_data.csv', 'w', encoding='utf-8') as f: 24 25 writer = csv.writer(f) 26 writer.writerow(HEADER) 27 28 #取得したメール一覧の処理 29 for num in data.split(): 30 ### 各メールへの処理 ### 31 result, d = gmail.fetch(num, "(RFC822)") 32 raw_email = d[0][1] 33 34 #文字コード取得用 35 msg = email.message_from_string(raw_email.decode('iso-2022-jp')) 36 msg_encoding = email.header.decode_header(msg.get('Subject'))[0][1] or 'iso-2022-jp' 37 38 # 日付の処理 39 date = dateutil.parser.parse(msg.get('Date')).strftime("%Y/%m/%d %H:%M:%S") 40 41 # タイトルの処理 42 subject = email.header.decode_header(msg.get('Subject')) 43 title = "" 44 for sub in subject: 45 if isinstance(sub[0], bytes): 46 title += sub[0].decode(msg_encoding) 47 else: 48 title += sub[0] 49 50 # 本文の処理 51 body = "" 52 if msg.is_multipart(): 53 for payload in msg.get_payload(): 54 if payload.get_content_type() == "text/plain": 55 body = payload.get_payload() 56 if msg_encoding == 'utf-8': 57 body = base64.urlsafe_b64decode(body.encode('ASCII')).decode("utf-8") 58 else: 59 if msg.get_content_type() == "text/plain": 60 body = msg.get_payload() 61 if msg_encoding == 'utf-8': 62 body = base64.urlsafe_b64decode(body.encode('ASCII')).decode("utf-8") 63 64 row = [date, title, body] 65 writer.writerow(row) 66 67 gmail.close() 68 gmail.logout() 69 return(0) 70 71main()
試したこと
・メールデータをdfに変換し、method='ffill'で日付とタイトルの空白行を埋めてみる。→埋まらず、解消ならず。
せめて、本文が1レコード内に収まれば、aplitで分割して、別途正規化しようと考えていますが、食い込んで意図しないカラムに入ってしまうことが解消できません。
補足情報(FW/ツールのバージョンなど)
JupyterNotebook環境にて実施。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/22 12:08
2021/04/22 12:36