2016-11-18 3 views
-2

Ich versuche, in Python eine Textdatei ähnlich der unten angegebenen zu importieren.Textdatei mit fester Breite im Python-Wörterbuch

+ 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 

Wo geht davon aus, dass ich einfach den Namen des Objekts durch < als begrenzt identifizieren kann ...>

Mein idealer Ausgang einen Python-Wörterbuch wäre, die die Hierarchie der txt-Datei reflektiert, so dass für Beispiel:

{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 
      } 
} 

In denke, die Grundidee ist hier die Anzahl der Registerkarten zu zählen, bevor Zeile beginnt und dies wird die Hierarchie diktieren. Ich habe versucht, Pandas read_fwf und numpy loadfromtxt zu sehen, aber ohne Erfolg. Können Sie mich auf relevante Module oder Strategien hinweisen, um dieses Problem zu lösen?

+0

Jeder Hinweis, wie das Problem nähern würde geschätzt. Nicht nur nach "out of the box" Lösungen suchen. – FLab

+0

Strategie: Da Ihre Datenstruktur flach ist (es ist eine Textdatei), müssen Sie einen eigenen Parser entwickeln, um zu erraten, den Namen zu erkennen. Um die Dictionary-Struktur zu erstellen, benötigen Sie einen Stack. –

Antwort

0

Keine vollständige Antwort, aber Sie können einen Ansatz mit einem Stapel folgen.

Jedes Mal, wenn Sie eine Kategorie eingeben, drücken Sie den Kategorieschlüssel zum Stapel. Dann lesen Sie die Zeile, überprüfen Sie die Anzahl der Registerkarten und speichern Sie entsprechend. Wenn der Level gleich oder höher ist als der vorherige, wird ein Gegenstand vom Stapel genommen. Dann brauchen Sie nur grundlegende Regex, um die Elemente zu extrahieren.

Einiger Python/Pseudo-Code, so dass Sie eine Idee haben, können

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

Hier ist eine Strategie:

Für jede Zeile RegEx verwenden, um die Linie und Extrahieren von Daten zu analysieren. Hier

ist ein Entwurf:

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)) 

Sie erhalten:

level: 2 
category: CATEGORY_2 
name: NAME_c 
Verwandte Themen