2016-11-18 5 views
-2

私はPythonで以下のようなテキストファイルをインポートしようとしています。ためのよう 固定長のテキストファイルをPython辞書

> ... <で区切らとして、私は簡単にオブジェクトの名前を識別できることを前提と私の理想的な出力は、txtファイルの階層構造を反映したPythonの辞書になり

+ CATEGORY_1 first_part of long attribute <NAME_a> 
|  ...second part of long attribute 
| + CATEGORY_2: a sequence of attributes that extend over 
| |  ... possibly many <NAME_b> 
| |  ... lines 
| | + SOURCE_1 => source_code 
| + CATEGORY_2: another sequence of attributes that extend over <NAME_c> 
| |  ... possibly many lines 
| | + CATEGORY_1: yet another sequence of <NAME_d> attributes that extend over 
| | |  ...many lines 
| | | + CATEGORY_2: I really think <NAME_e> that 
| | | |  ... you got the point 
| | | |  ... now 
| | | | + SOURCE_1 => source_code 
| + SOURCE_2 => path_to_file 

例:

{NAME_a : {'category' : CATEGORY_1, 
      'depencencies' : {NAME_b : {'category' : CATEGORY_2, 
             'source_type' : SOURCE_1, 
             'source_code' : source_code} 
          NAME_c : {'category' : CATEGORY_2, 
             'dependencies' : { NAME_d : {'category' : CATEGORY_1, 
                    'dependencies' : NAME_e : {'category' : CATEGORY_2, 
                           'source_type' : SOURCE_1, 
                           'source_code' : source_code} 
                    } 
                 }   
      'source_type' : SOURCE_2, 
      'source_code : path_to_file 
      } 
} 

では、ここでの主なアイデアは、ラインが始まる前に、タブの数をカウントすることであり、これは階層構造を決定すると思います。 私はパンダread_fwfとnumpy loadfromtxtを見ようとしましたが、成功しませんでした。 この問題を解決するための関連モジュールまたは戦略を教えてください。

+0

を問題にアプローチする方法上の任意のヒントをいただければ幸いです。 「すぐに使える」ソリューションだけを探しているわけではありません。 – FLab

+0

戦略:データ構造がフラットなので(テキストファイル)、レベルを推測して名前を認識するために独自のパーサを開発する必要があります...辞書構造を構築するにはスタックが必要です。 –

答えて

0

完全な答えではありませんが、スタックを使用したアプローチに従うことができます。

カテゴリを入力するたびに、カテゴリキーがスタックにプッシュされます。 次に、行を読んで、タブの数を確認し、それに従って保存します。レベルが前例と同じかそれより高い場合は、スタックから項目をポップします。 次に、アイテムを抽出するための基本正規表現が必要です。

いくつかのPython /擬似コードあなたはここで

levels = [] 
items = {} 
last_level = 0 

for line in file: 
    current_level = count_tabs() 
    if current_level > last_level: 
     name = extract_name(line) 
     levels.append(name) 
     items = fill_dictionary_in_level(name, line) 
    else: 
     levels.pop() 
    last_level = current_level 

return items 
0

アイデアを持っていることができるように戦略です:各行に対して

、ラインおよび抽出データを解析するために正規表現を使用しています。ここで

はドラフトです:

import re 

line = "| + CATEGORY_2: another sequence of attributes that extend over <NAME_c>" 

level = line.count("|") + 1 
mo = re.match(r".*\+\s+(?P<category>[^:]+):.*<(?P<name>[^>]+)>", line) 
category = mo.group("category") 
name = mo.group("name") 

print("level: {0}".format(level)) 
print("category: {0}".format(category)) 
print("name: {0}".format(name)) 

あなたが得る:

level: 2 
category: CATEGORY_2 
name: NAME_c