Datei auslesen und in Dict umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hoopy
User
Beiträge: 2
Registriert: Samstag 30. Januar 2010, 11:09

Hi Ihr.
Ich bin Python-Anfänger und komme einfach nicht weiter. Ich hoffe ihr könnt mir weiterhelfen.

Folgende Situation:
Ich habe eine Datei, die so aufgebaut ist:

|key1 ....
value über mehrere Zeilen
|key2 ....
value über mehrere Zeilen

Die Datei ist also so aufgebaut das hinter | der Key steht mit weiteren Einträgen dahinter, die nicht als Key fungieren. In den folgenden Zeilen ist der zugehörige Value.
Key und Value sollen in ein dict organisiert werden.
Mein bisheriger Code:

Code: Alles auswählen

f = open("test")
dict={}
s=""
for line in f:
    line = line.split(" ")
    if "|" in line:
          dict[line[0]] = s
    else:
          s+= line ???

Mein Problem ist, wie ich über die folgenden Zeilen iteriere bis zur nächsten Markierung.

Viele Grüße und Danke im Voraus.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

import re

def load(n):
	d = {}
	k = None
	with open(n) as f:
		for line in f:
			m = re.match(r"\|(\w+)", line)
			if m:
				k = m.group(1)
				d[k] = ""
			elif k:
				d[k] += line
	return d
Stefan
hoopy
User
Beiträge: 2
Registriert: Samstag 30. Januar 2010, 11:09

Funktioniert super. Danke.
mathgirl
User
Beiträge: 1
Registriert: Donnerstag 13. Mai 2010, 09:59

Hallo Ihr,

ich habe leider keine Erfahrung mit Programmierung und muss ein ähnliches Problem lösen. Die Datei, die ich vor mir liegen habe, ist auch so aufgebaut. Ich muss aber die Datei ohne "def" auslesen und in dict speichern. Ich habe leider keine Ahnung wie das geht.

Könnte mir vielleicht jemand zeigen, wie das ohne "def" geht? Ich wäre euch echt dankbar.

Liebe Grüße
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Aus dem "muss aber die Datei ohne def auslösen" schließe ich mal, dass das eine Schulaufgabe ist, wo die Lehrkraft wünscht, dass keine Funktionen benutzt werden. Da dies so ziemlich das erste sein dürfte, was man lernt -- jedenfalls vor regulären Ausdrücken und IMHO auch Dateioperationen -- kann das mit so begrenztem Wissen schwierig werden. Und "keine Erfahrung mit Programmierung" hilft da auch nicht wirklich weiter ;)

Mein Tipp: Lernen.

Es gibt ein gutes deutsches Tutorial zu Python und wie man die Funktionsdefinition aus meinem Beispiel entfernt, sollte man sich dann in 2 Minuten zusammenreimen können. Nur wie gesagt, wäre ich Lehrer und würde mich an einem "def" stören, dann wäre "import re" ebenso ein no-go.

Stefan
BlackJack

@mathgirl: Warum musst Du das ohne eine Funktion machen?

@sma: Das `re` sollte doch auch durch ein `str.startswith()` ersetzbar sein, oder? Zumindest wenn ich die Problembeschreibung richtig verstanden habe.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

BlackJack hat geschrieben:@sma: Das `re` sollte doch auch durch ein `str.startswith()` ersetzbar sein, oder? Zumindest wenn ich die Problembeschreibung richtig verstanden habe.
Natürlich gibt es diverse Möglichkeiten. Ich meinte ja nur, selbst wenn man bei meinem Beispiel einfach das "def" entfernt -- was so simpel sein sollte, dass ich keine Notwendigkeit sehe, da weiter darauf einzugehen, müsste man meine Lösung noch ändern, damit da keine regulären Ausdrücke benutzt werden.

Stefan
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

mathgirl hat geschrieben:Hallo Ihr,

ich habe leider keine Erfahrung mit Programmierung und muss ein ähnliches Problem lösen. Die Datei, die ich vor mir liegen habe, ist auch so aufgebaut. Ich muss aber die Datei ohne "def" auslesen und in dict speichern. Ich habe leider keine Ahnung wie das geht.

Könnte mir vielleicht jemand zeigen, wie das ohne "def" geht? Ich wäre euch echt dankbar.

Liebe Grüße
Kannst du nicht von hoopy abschreiben, wenn ihr schon die gleiche Hausaufgabe macht?
Bottle: Micro Web Framework + Development Blog
BlackJack

@Defnull: Nee, hoopy hat ja das mit dem ``def`` abgeschrieben. ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Defnull hat geschrieben: Kannst du nicht von hoopy abschreiben, wenn ihr schon die gleiche Hausaufgabe macht?
Naja, wäre zeitlich auch ziemlich versetzt ;-)

Ich würde ja mal (wie immer) fragen, ob die Eingabedaten denn wirklich in der Form vorliegen müssen, oder ob man die nicht auch ändern könnte? Wenn ja, gibt es sicherlich bessere Formate (JSON, XML, INI), die man dafür nehmen könnte.

Ich erinnere mich noch immer mit Grausen an diesen Thread... insofern immer erst mal das Eingabeformat anzweifeln! *, **


*: Außer man heißt sma und hat Spaß am Schreiben von Parsern :mrgreen: SCNR
**: Aber dafür ist das Format ja eigentlich zu belanglos ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hyperion hat geschrieben:*: Außer man heißt sma und hat Spaß am Schreiben von Parsern
Wie heißt es so schön? Wenn man einen guten Hammer hat, sieht alles wie ein Nagel aus :)

Stefan
Antworten