2016-07-12 10 views
-1

タイトルには私の問題が全く説明されていませんが、ここで紹介します。 Google APIを使用してGmailアカウントからメールを解析しています。各電子メールからいくつかの値を取得する必要があります。電子メール本文は次のように構成されます。Pythonで次のキーに達するまで辞書から値を取得

オブジェクト:何か。

手順:何か。

...

(多くの分野)

...

要求(単一行または複数行であることができる値)

全て取得します私が必要とするフィールドは、私はこれを行う:

for msg in msg_list: 
     data_dict = OrderedDict() 

     msg = msg.replace('\r','') 
     msg = msg.split('\n') 

     for row in msg: 
      row = row.split(":") 

      if row[0] in key_list: 
       data_dict[row[0]] = row[1] 

     dict_list.append(data_dict) 

return dict_list 

私は特定のフィールド 'Reqこれは複数行で、 'msg.split(' \ n ')'を使用することができますので、これを取得します:

"リクエスト:(フィールドの最初の行)"、 "(フィールドの2番目の行)」、 ...

"フィールドの(第n行)" 順序でdictの

値として最初の行のみを進みます。 コンテンツ全体をどのように入手できますか? 私はそれがうまく説明されることを願っています。

ここでは、msg_listから取らmsg (already splitted)の形である:

'',

'La pratica Ticketing TSX - 2016-049044 necessita di essere lavorata.',

'',

'Procedura: MATRIX - Enterprise Data Warehouse',

'Oggetto: Mancata esecuzione algoritmo stima reddito (DASTIRED)',

'Perimetro: Specifico',

'Priorit=C3=A0 richiesta: Alta',

'Tipologia Richiesta: Segnalazione Anomalia',

'Sottotipologia Richiesta: Altro',

'',

'Emergenza:',

'',

"Richiesta: Ad oggi l'algoritmo mensile di stima reddito (sequence DASTIRED)",

"non risulta ancora essere stato eseguito. Solitamente l'esecuzione",

'automatica avviene entro i primi 10 giorni del mese dopo che tutte le',

'dipendenze sono state soddisfatte ma attualmente vedo ancora il job nello',

'schedulatore con stato W. Chiedo la cortesia di verificare perch=C3=A9 non =',

'sia',

'ancora stato eseguito (problemi su flussi attesi?) e di provvedere al',

'recupero. Grazie',

'',

'UO Richiedente: INF',

'Autore: UT07080 - SPADINI MATTEO',

'Data richiesta risoluzione:',

'Scadenza SLA : 24/06/2016 14.12.36',

'',

ありがとうございました。

+1

'Request:'フィールドの終わりを決めるのは、文字列の終わり/ファイルの終わり/別の区切り文字/ etcの始まり...? –

+0

@JonClements空白の行 – echo

+0

大丈夫です - それで、空白行が効果的にエントリを区切りますか?つまり、 - ファイル内に複数のレコードがあり、その中からdictsのリストを作成しようとしていますか? (私が正しく理解していれば) –

答えて

1

あなたのコードに若干の変更がトリックを行う必要があります。上記の生成

import collections 
key_list = ['Object','Procedure','Request'] 
dict_list = [] 
msg1 = 'Object: the object\nProcedure: the procedure\n' 
msg1 += 'some data\nsome more data\n' 
msg1 += 'Request: request line 1\nrequest line2\nrequest line3\n' 
msg2 = 'Object: another object\nProcedure: another procedure\n' 
msg2 += 'some more data\nsome even more data\n' 
msg2 += 'Request: another request line 1\nanother request line2\n' 
msg_list =[msg1,msg2] 

for msg in msg_list: 
    data_dict = collections.OrderedDict() 
    msg = msg.replace('\r','') 
    msg = msg.split('\n') 
    for row in msg: 
     row = row.split(":") 
     if row[0] in key_list: 
      key = row[0] 
      data_dict[key] = row[1] 
     elif key in key_list: 
      data_dict[key] += row[0] 
     else: 
      key = '' 

    dict_list.append(data_dict) 

#show results 
for i in dict_list: 
    for k,v in i.items(): 
     print k,v 

:オブジェクト
手順proceduresome datasomeより多くのデータ
リクエスト要求ライン1request line2request LINE3
オブジェクト
オブジェクトを別のオブジェクト
プロシージャ別のプロシージャー複数のデータをさらに集めます。さらに多くのデータ
別の要求ラインをリクエストします。1a nother request line2

+0

私はこのエラーがあります:UnboundLocalError:割り当て前に参照されているローカル変数 'key'。 'global'を使うべきですか? – echo

+0

msg_list:forループのfor msgで初期化するだけです。 key = ''は細かいものでなければならない –

+0

もう少し小さな問題ですが、このようにして次のフィールドも得られます。なぜですか? – echo

関連する問題