Daten aus einer Datei auslesen und Formatieren

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
eiton
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 20:24

Hallo
ich hab eine Datei mit zB folgendem Inhalt:
Max Mustermann, 0179 123456789, 17.03.1980
Toni Test, 0150 123456789, 21.11.1985
Monika Musterfrau, 0151 123456789, 22.10.1980
Jetzt möchte diese Daten auslesen und und nach Geburtsjahr sortiert in ein Dictionary mit einer Liste von Tupeln schreiben.
ZB:
{'1980':[(Mustermann, Max),(Musterfrau, Monika)]}
{'1985':[(Test, Toni)]}
Bisher hab ich das so Versucht (bin nicht weit :oops:)
Also will erstmal nur eine Liste mit vernünftiger Formatierung erstellen, also Schritt für Schritt rantasten.

Code: Alles auswählen

import re
pfad = "D:/pythprogs/files/"
dateiname = "daten.txt"
datei = pfad+dateiname
in_file = open(datei,"r")
text = in_file.read().split(','+'')
in_file.close()
list = []
dict = {}
for line in text:
	line = line.strip()
	line = line.split("\n")
	list.append(line)
print list
Leider kommt sowas bei raus...
[['Max Mustermann'], ['0179 123456789'], ['17.03.1980', Toni Test'], ['0150 123456789'], ['21.11.1985', Monika Musterfrau'], [0151 123456789'], ['22.10.1980']]
Wenn ich readline schreibe, dann wird das ganze wunderbar Formatiert, aber eben nur eine Zeile...

Wäre über paar Tipps dankbar wie ich meine Liste vernünftig ausgeben könnte und evtl. wie ich das Gesamtproblem besser angehen könnte.

mfg eiton
BlackJack

@eiton: Falls Du das Tutorial in der Python-Dokumentation noch nicht durchgearbeitet hast, solltest Du das nachholen.

Du teilst den Inhalt der gesamten Datei an Kommas auf. Und nennst dann die erhaltenen Teile `line`. Das ist ja schonmal falsch, denn `text` enthält keine einzelnen Zeilen.

Zeilenweise verarbeiten ist aber schon mal eine gute Idee.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ergänzend zu BlackJack möchte ich schon mal einen ersten Ansatz liefern damit du nicht zu lange im Nebel stocherst:

Code: Alles auswählen

with open(filename, "r") as f_in:
    for line in f_in:
        print(line)
Eine weitere Anmerkung zu deinem Code ist allerdings auch noch dringend erforderlich. Du solltest Schlüsselwörter nur dann überschreiben wenn dir erstens klar ist was du da tust und wenn es zweitens wirklich unbedingt vonnöten ist. dict und list sind zwei äußerst ungünstig gewählte Variablennamen.

Zum Schluss noch eine Frage: Was soll das ','+'' in der Zeile

Code: Alles auswählen

text = in_file.read().split(','+'')
eigentlich darstellen?
eiton
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 20:24

Danke für die schnelle Antworten.

@BlackJack nein das Tutorial hab ich nicht gemacht. Hatte das hier eigentlich überwiegend benutzt.http://openbook.galileocomputing.de/pyt ... x.htm#_top

@/me
OK wird ich mal austesten und deinen Rat beherzigen.

Das ','+'' sollte anfangs beim ',' und beim Leerzeichen spliten, das hatte allerdings irgendwie nicht Funktioniert und ist eigentlich nur ein Überbleibsel von meinem "herumgespiele".

Danke nochmal euch beiden. Für weitere Tipps bin ich immer offen ;)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Warum kommen alle Leute immer aufs OpenBook?

Wieso finden die keine vernünftige Alternative.

Edit:
so?

Code: Alles auswählen

from collections import defaultdict

def sorted_iteritems(d):
    for k in sorted(d.keys()):
        yield k, d[k]

s='''Max Mustermann, 0179 123456789, 17.03.1980
Toni Test, 0150 123456789, 21.11.1985
Monika Musterfrau, 0151 123456789, 22.10.1980'''

d = defaultdict(list)
for line in s.split('\n'):
    name, tel, birthdate = [s.strip() for s in line.split(',')]
    fname, sname = name.split()
    d[int(birthdate.rsplit('.',1)[-1])].append((sname,fname))


for k, v in sorted_iteritems(d):
    print k, v

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
eiton
User
Beiträge: 3
Registriert: Montag 7. Dezember 2009, 20:24

Danke für den kompletten Code, blick da noch nicht ganz so durch, die meisten Sachen sind mir auch bisher fremd. Jedenfalls sagt der beim starten:

d = defaultdict(list)
TypeError: first argument must be callable

mit google hab ich da jetzt nicht soviel gefunden nur das dieser Fehler wohl bei defaultdict passiert...

Wegen OpenBook, kannst du mir bitte eine vernünftige Alternative nennen, für den Anfang sah das die OpenBook ganz schick aus.

mfg
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Immernoch das Tutorial: http://docs.python.org/tutorial/

Kann das Verhalten in Python 2.6 uebrigens nich nachvollziehen:

Code: Alles auswählen

>>> import  collections
>>> d = collections.defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

jbs hat geschrieben:Hast du list überschrieben?
Und sogar `dict` :) Strike.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich hab mal `python openbook` gegoogelt. Und BlackJacks Meinung ist sogar schon auf der ersten Seite vertreten. Da habe ich entdeckt, dass google eine aufwert-Funktion hat. Die habe ich dann auch gleich mal ausprobiert :).
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@jbs: Juhuu, dann scheint mein Geheimplan diesen Verlag zu vernichten, langsam Fahrt aufzunehmen. :-D
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Inzwischen schon 3... :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

eiton hat geschrieben:Hallo
ich hab eine Datei mit zB folgendem Inhalt:
Max Mustermann, 0179 123456789, 17.03.1980
Toni Test, 0150 123456789, 21.11.1985
Monika Musterfrau, 0151 123456789, 22.10.1980
Darf man fragen, wo die herkommt? Ist die selber so angelegt? Kann man das Format ggf. noch ändern?

Imho sollte man bei Anfängern diese Frage auf jeden Fall stellen! Denn eigene Formate "erfinden" ist imho oftmals Resultat der Unkenntnis besserer Alternativen.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Kann das csv-Modul diese Dateien nicht verarbeiten ? (ggf mit ", ", d.h. <komma><leerzeichen> als Trennzeichen)

hth, Jörg
Antworten