0

基本的に、その場しのぎのスーパーワードカウントを行いたいのですが、必要なことを行うためのリストではなく、ディレクトリパス(引数として渡される)からdictオブジェクトを作成する方法がわかりません。

辞書オブジェクトを作成したいのですが、電子メール モジュールを使用して、ファイル名であるキーの ASCII 値を電子メールまたはメッセージ オブジェクトにフォーマットしたいと考えています。次に、ペイロードを使用して本文を抽出し、そのように解析します。以下に例を示します。

mylist=os.listdir(sys.stdin)
for emails in mylist:
    email_str = emails.open()
    #uncertain if this will get all emails and their content or not
    #all emails are supposed to have a unique identifier, they are essentially still just ascii
    file_dict = {emails : email_str}
#file_dict = dict(zip(mylist, mylist))
for emails in file_dict[emails]:
    msg = email.message_from_string(email_str)
    body = msg.get_payload(decode=True)
    #I'm not entirely sure how message objects and sub objects work, but I want the header to 
    #signature and I'm not sure about the type of emails as far as header style
    #pretend I have a parsing method here that implements the word count and prints it as a dict:
    body.parse(regex)

値を解析する以外にキーはまったく必要ないので、代わりに message_from_file を使用することを検討してください。

4

2 に答える 2

0

ファイル パスとして任意の文字列を使用でき、相対ファイル パスを使用することもできます。自分用にデータをフォーマットしようとしているだけなら、電子メール メッセージのリストを反復処理して、出力を保存することができます。

for emailpath in list_of_email_paths
    emailpath = 'someemailpath'
    # open path -- only works if path exists.
    f = open(emailpath)
    file_dict[emailpath] = f.read()
    f.close()

開いているファイル オブジェクトをキーとして使用するのは良い考えではありません (可能な場合でも、それらを読み取り、文字列を識別子として格納するだけです。詳細については、ドキュメントを参照してください (ところで、 ではなくos.pathでインポートする必要があります) 。import osimport os.path

それとは別に、不変のオブジェクトまたは参照は辞書のキーになる可能性があるため、パスをキーとして保存しても問題はありません。Python はパスがどこから来たかを気にしませんし、そのキーがパスであるかどうかを dict も気にしません;)

于 2012-04-09T04:49:38.180 に答える
0

残念ながら、一度に多くの情報を表示するよう求めているため、それらを概説するために、私の回答はもう少し一般的なものにする必要があります。あなたの例はすべて純粋に擬似コードであると述べましたが、それはすべて完全に間違っているため、何を理解し、どの部分を理解していないかを知るのは難しいので、コメントであなたが言ったことのすべての基礎をカバーします.

ファイルの読み方

os.listdirファイルタイプのオブジェクトではなく、文字列パスを取るため、 を誤用しています。しかし、個人的にはこれを使用するのが好きglobです。フルパスを取得し、パターンでフィルタリングするためのいくつかの手順を節約できます。すべての電子メール ファイルが.mail

import sys
import glob

first_path = sys.argv[1]
pattern = "%s/*.mail" % first_path
for mail in glob.iglob(pattern):
    # with context will close the file automatically
    with open(main) as f:
        data = f.read()
        # do something with data here

メール形式の解析

モジュールを使用するための例emailは広範であるため、レビューへのリンクを提供する以外に、ここでそれらを示す意味はありません: http://docs.python.org/library/email-examples.html
ファイルが実際に電子メールの場合、このモジュールを使用してそれらを解析し、それぞれのメッセージ本文を読み取ることができるはずです

辞書の使用

この場合、辞書を使用することは、python dict の一般的な場合と同じです。空の dict を作成することから始めます。

file_dict = {}

また、ディレクトリ リストのループごとに、キーにしたい文字列のパス名が常に表示されます。最初の例を使用してファイルの生データを読み取った場合でも、電子メール モジュールを使用してメッセージ本文を取得した場合でも、いずれの方法でもテキスト データのチャンクが得られます。

for mail in glob.iglob(pattern):
    ...
    # do stuff to get the text data from the file
    data = some_approach_to_reading_file()
    ...
    file_dict[mail] = data

これfile_dictで、キーが元のファイルへのパスで、値が読み取られたデータです。

概要

これら 3 つのセクションで、これらすべてをまとめるための十分な一般情報が得られるはずです。

于 2012-04-09T20:41:05.520 に答える