質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1045閲覧

二つ目のファイルを読み込み、printする方法

UserName

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/06/20 08:15

編集2022/06/21 05:11

適当に

import sys import email from email.header import decode_header import datetime import glob # ファイル数カウント tifCounter = len(glob.glob1("./mail","*.eml")) print(tifCounter) # ファイル名読み込み for x in glob.glob('./mail/*'): mail_file_path = x class MailParser(object): """ メールファイルのパスを受け取り、それを解析するクラス """ def __init__(self, mail_file_path): self.mail_file_path = mail_file_path # emlファイルからemail.message.Messageインスタンスの取得 with open(x, 'rb') as email_file: self.email_message = email.message_from_bytes(email_file.read()) self.subject = None self.to_address = None self.cc_address = None self.from_address = None self.body = "" self.date = None # 添付ファイル関連の情報 # {name: file_name, data: data} self.attach_file_list = [] # emlの解釈 self._parse() def get_attr_data(self): """ メールデータの取得 """ result = """\ DATE: {} FROM: {} TO: {} CC: {} ----------------------- BODY: {} ----------------------- ATTACH_FILE_NAME: {} """.format( self.date, self.from_address, self.to_address, self.cc_address, self.body, ",".join([ x["name"] for x in self.attach_file_list]) ) return result def _parse(self): """ メールファイルの解析 __init__内で呼び出している """ self.subject = self._get_decoded_header("Subject") self.to_address = self._get_decoded_header("To") self.cc_address = self._get_decoded_header("Cc") self.from_address = self._get_decoded_header("From") # 変更したところ self.date = datetime.datetime.strptime( self._get_decoded_header("Date"), "%a, %d %b %Y %H:%M:%S %z" ) # メッセージ本文部分の処理 for part in self.email_message.walk(): # ContentTypeがmultipartの場合は実際のコンテンツはさらに # 中のpartにあるので読み飛ばす if part.get_content_maintype() == 'multipart': continue # ファイル名の取得 attach_fname = part.get_filename() # ファイル名がない場合は本文のはず if not attach_fname: charset = str(part.get_content_charset()) if charset: self.body += part.get_payload(decode=True).decode(charset, errors="replace") else: self.body += part.get_payload(decode=True) else: # ファイル名があるならそれは添付ファイルなので # データを取得する self.attach_file_list.append({ "name": attach_fname, "data": part.get_payload(decode=True) }) def _get_decoded_header(self, key_name): """ ヘッダーオブジェクトからデコード済の結果を取得する """ ret = "" # 該当項目がないkeyは空文字を戻す raw_obj = self.email_message.get(key_name) if raw_obj is None: return "" # デコードした結果をunicodeにする for fragment, encoding in decode_header(raw_obj): if not hasattr(fragment, "decode"): ret += fragment continue # encodeがなければとりあえずUTF-8でデコードする if encoding: ret += fragment.decode(encoding) else: ret += fragment.decode("UTF-8") count =+ 1 return ret if __name__ == "__main__": result = MailParser(sys.argv[1]).get_attr_data() print(result)

emlファイルの件名や本文などを取得するプログラムで、emlファイル1つなら取得することができるのですが、2つ目以降ができません。

どのように直したら、mailフォルダ内にある複数のemlファイルを読み込んで読み込んでprintprintすることができるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/06/20 11:10

質問の内容がよくわかりません。 「今のままだと最初の一つしかだせない」というのはどのようにしたときですか? そして、このプログラムは修正しようとしているようですが、どのように修正したいのですか。
guest

回答1

0

ベストアンサー

質問がやっぱりよくわからないのですが、

python

1if __name__ == "__main__": 2 result = MailParser(sys.argv[1]).get_attr_data() 3 print(result)

ここが実行部分で、 「sys.argv[1]」は、コマンドでの実行時の引数ですから、「emlファイル1つなら取得することができる」というのは、コマンドでファイル名を指定すれば表示される、ということだとしましょう。

また、「2つ目以降ができません」の意味は、

python

1for x in glob.glob('./mail/*'): 2 mail_file_path = x

これが追加してみた処理で、この mail ディレクトリにあるメールファイルをすべて対象にしたいということだとしましょう。

うまくいくかどうかは別として、そのfor文で取得したファイル名について処理していのであれば、for文を、下の方に持ってきて、こんな感じにすればいいでしょう。

python

1if __name__ == "__main__": 2for mail_file_path in glob.glob('./mail/*'): 3 result = MailParser(mail_file_path).get_attr_data() 4 print(result)

うまく動くには、実行しているディレクトリにmailフォルダがあること、mailフォルダにemlファイルがあること、emlファイル以外のファイルが無いこと、あたりが必要になると思います。

また、

python

1# ファイル数カウント 2tifCounter = len(glob.glob1("./mail","*.eml")) 3print(tifCounter)

この処理は確認のために入れているのだと思いますが、「if name == "main":」の下にもっていった方がいいでしょう。
また、ここではちゃんと「*.eml」を指定して取得しているのですがら、ループのところでもちゃんと同じにしたほうがいいですね。

投稿2022/06/21 06:45

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UserName

2022/06/21 07:57

でででできましたーーーー! 神様です!ありがとうございました!!!!!😭
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問