2016-07-05 5 views
-2

Ich versuche, Daten aus einigen Dateien zu lesen und diese in Wörterbuch Die Datei, die ich lese sieht aus wie untenPython wie Wörterbuch verwendet

file_1.txt 
line 1: Given Problem1, Incorrect Answer, Correct Answer, Rule 
line 2: ___blank___ , Incorrect_Answer 
line 3: ___blank___ , Incorrect_Answer 
line 4: Given Problem2, Incorrect Answer, Correct Answer, Rule 
line 5: ___blank___ , Incorrect_Answer 
line 6: ___blank___ , Incorrect_Answer 

So gibt es eine Frage, Antwort zu korrigieren, und Regel speichern aber mehrere Incorrect_Answer

Die Form des Wörterbuch, das ich will Aussehen erhalten, wie unten {Frage, Incorrect_Answer [... (array vielleicht?)], Correct_Answer, Regel}

ich habe bisher diese.

for line in open(thatfile.txt,'r').readlines()[2:]: # scan through the file, but skip the first two lines that contain metadata (data headers) 
if line[0].startswith('Question '): 
    continue: 
elif line starts with ' ' #there will be only incorrect_answer in this line 
    input line[1] to Incorrect_Answer array 
else 
    input line[0] to Question 
    input line[1] to Incorrect_Answer array 
    input line[2] to Correct_Answer 
    input line[3] to Rule $ 
+0

Welche Probleme haben Sie mit diesem Code? Bitte sei so genau wie möglich. –

+1

Ist das genau * Wie sieht die Datei aus? –

Antwort

0

Sie wollen mit einem Hauptausgabeergebnis Behälter und einer Frage Platzhalter starten:

>>> result = {} 
>>> question = None 

Dann sind Sie tun, um Ihre normale Verarbeitung jeder Zeile, während für die Frage Änderungen beobachten, falsche Antworten anhängen:

>>> for line in txtfile: 
... pieces = line.split(',') 
... if pieces[0] not in (question, ' ___blank___ '): 
...  question = pieces[0] 
...  result[question] = {'Incorrect': [pieces[1]], 
...       'Correct': pieces[2], 
...       'Rule': pieces[3]} 
... elif pieces[0].startswith(' '): 
...  result[question]['Incorrect'].append(pieces[1]) 

Welche gibt Ihnen:

>>> pprint(result) 
{'Given Problem1': {'Correct': ' Correct Answer', 
        'Incorrect': [' Incorrect Answer', 
            ' Incorrect_Answer', 
            ' Incorrect_Answer'], 
        'Rule': ' Rule'}, 
'Given Problem2': {'Correct': ' Correct Answer', 
        'Incorrect': [' Incorrect Answer', 
            ' Incorrect_Answer', 
            ' Incorrect_Answer'], 
        'Rule': ' Rule'}} 
+0

Was bedeutet nicht (Frage, 'leer')? –

+0

'nicht in (Frage, '___blank___') ist eine Möglichkeit festzustellen, wann sich die Frage ändert. Da Sie bei leeren Zeilen keine Frage erhalten, vergleichen Sie die aktuelle Frage (oder den leeren Eintrag) mit der zuletzt gefundenen Frage. Die Bedingung wird nur ausgelöst, wenn Sie eine neue Frage sehen, die Sie noch nie gesehen haben (oder die erste Frage, wenn der Platzhalter "None" ist). –

+0

danke für die schnelle antwort! Ich habe das Konzept und jetzt wissen, warum es nicht in (Frage), aber immer noch ein bisschen verwirrt über '___blank___' Teil. also überprüft es, ob Teile [0] ___blank___ bekommen oder nicht? Wenn ja, wird die Bedingung übersprungen oder? –

0

Ich nehme an, dass - wie Sie oben schreiben - die Frage und die Antworten durch Kommas getrennt sind.

alldata = [] 
# scan through the file, but skip the first two lines 
# that contain metadata (data headers) 
for line in open(thatfile.txt,'r').readlines()[2:]: 
    lineparts = line.split(',') # or how else can one separate the parts? 
    if len(lineparts) == 4: 
     thisset = {'Question': lineparts[0], 
        'Incorrect': [lineparts[1]], 
        'Correct': lineparts[2], 
        'Rule': lineparts[3]} 
     alldata.append(thisset) 
    # if there are not 4 parts and the data is perfect, this is an incorrect answer 
    else: 
     thisset["Incorrect"].append(lineparts[1]) 

print("Incorrect answers to first question:") 
print(alldata[0]["Incorrect"]) 

So erhalten Sie am Ende eine Liste der Wörterbücher "alldata". Jedes Wörterbuch entspricht einem Problem. Die falschen Antworten sind selbst wieder eine Liste von Strings.