Textdatei einlesen

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
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallo,
Ich habe eine sehr simple Frage, die mich noch zum Wahnsinn treibt:
Wie kann ich den Inhalt einer Textdatei (die Datei enthält in jeder Zeile ein integer-Zahl) in eine Liste schreiben?
Ich habe schon dutzende Tutorials und Forumbeiträge gelesen, leider ohne Erfolg.
Ich lese die Datei mit f.read() aus, aber dann habe ich einen String mit Zeilenumbruchzeichen \n.
Wie kann ich diesen String in eine Liste umwandeln und was wäre besser, eventuell mit f.readline() zeilenweise auslesen und umwandeln?

Vielen Dank für die Antworten im Voraus!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Axi hat geschrieben: Wie kann ich den Inhalt einer Textdatei (die Datei enthält in jeder Zeile ein integer-Zahl) in eine Liste schreiben?
Ich habe schon dutzende Tutorials und Forumbeiträge gelesen, leider ohne Erfolg.
Dann hast Du aber nicht gut recherchiert... im offiziellen Tutorial in Abschnitt 7.2.1 steht die Lösung; dazu dann noch in der Doku zur Standard Lib Kapitel 2, die Built-in Funktionen und dort int().
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallo Hyperion.
danke für die schnelle Antwort.
Ich habe diese Dokumente doch gelesen, werde aber daraus nicht schlau.
Ich kann den Inhalt der Datei in einen String einlesen, kann aber daraus keine Liste erzeugen. Das ist mein Problem.
Ich erhalte eine List mit einem einzigen Wert, bestehend aus dem Inhalt der ganzen Datei, etwa so ['2,\n,3,\n...']
Wie komme ich von diesem String zu einer Liste, die nur die Zahlenwerte enthält.
Axi
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

zeig mal dein jetzigen Programm (Quellcode), dann kann man dir auch helfen.
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallo DaMutz,
das ist mein Program, letzter Stand:
dateiname = "xx.txt"
a=range(1,30)

datei = open(dateiname, 'r')
line=datei.readline()

i=0

while line :
line=datei.readline()
print "a",int(line) #um zu guckewn, was passiert
a= int(line)
i=i+1

datei.close()
print a[6]

Am Ende erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "D:\Python26\baskabirdeneme.py", line 16, in <module>
print "a",int(line)
ValueError: invalid literal for int() with base 10: ''

Wie gesagt, der ltzte Stand. Ob das korekt ist?
Wielen Dank für Deine Muhe
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

oben steht a=range(1,30)
wenn ich stattdessen a=[] nehme, erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "D:\Python26\baskabirdeneme.py", line 17, in <module>
a= int(line)
IndexError: list assignment index out of range
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Axi hat geschrieben:Hallo Hyperion.
danke für die schnelle Antwort.
Ich habe diese Dokumente doch gelesen, werde aber daraus nicht schlau.
Ich kann den Inhalt der Datei in einen String einlesen, kann aber daraus keine Liste erzeugen. Das ist mein Problem.
http://docs.python.org/tutorial/inputou ... ting-files
Dort der 4. Absatz.

Dazu noch das:
http://docs.python.org/tutorial/datastr ... rehensions

Weil ich grad von Java genervt bin:

Code: Alles auswählen

In [9]: from StringIO import StringIO

In [10]: data = "\n".join(map(str, range(10)))

In [11]: data
Out[11]: '0\n1\n2\n3\n4\n5\n6\n7\n8\n9'

In [12]: f = StringIO(data)

In [13]: for line in f:
   ....:     print line
   ....:
   ....:
0
1
2
3
4
5
6
7
8
9

In [14]: f = StringIO(data)

In [15]: [int(line) for line in f]
Out[15]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Das ist die Ausgabe einer Sitzung in der Python Shell ipython. Bei IN[13] gehts für Dich los, nachdem Du mittels

Code: Alles auswählen

with open("deine_datei", "r") as f:
das File-like-object an den Namen "f" gebunden hast. (f ist eigentlich eher unschön, da solltest Du einen aussagekräftigeren Namen wählen!)

Die Lösung findet sich dann bei IN[15] ;-) Die Liste musst Du dann eben noch an einen Namen binden, wenn Du damit dann noch etwas machen magst.

Arbeite mal das Tutorial durch! Ohne diese Grundlagen wirst Du nicht weit kommen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallo Hyperion,
ersmal vielen Dank for Deine Mühe.
Das ist ein ganz schöner Brocken. Ich muss es erstmal verstehen.
(Heute ist erst mein zweiter Tag am Python)
Was mir auffällt:
Das ist ja weit schwieriger als bei C++
Dabei heißt es Phyton sei einfacher als andere Sprachen. Ist das überall so?
Vielen Dank
Axi
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

bitte verwende in Zukunft 'code' oder 'python'-Tags damit der Quellcode richtig dargestellt wird.

Python ist nicht so schwer. Dein Problem kann man relativ einfach lösen. Das Python schwerer ist wie C++ bezweifle ich, es ist einfach ein bisschen anders.

Code: Alles auswählen

dateiname = "xx.txt"

with open(dateiname, 'r') as f:
    a = [int(line) for line in f]

print a[6]
oder so

Code: Alles auswählen

dateiname = "xx.txt"

a = []
with open(dateiname, 'r') as f:
    for line in f:
        a.append(int(line))

print a[6]
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallu DaMutz,
vielen Dank für Deinen Quelltext.
Ich war grad am Überlegen, ob ich nicht mit C++ weitermache, weil mir der Code von Hyprion etwas zu kompliztiert erschien, obwoh sicherlich sehr solide. Schade, dass ich noch nicht soweit in der Materie drin bin, dass ich es auf einen Blick verstehen könnte.
Aber Deine Version hat mich überzeugt, dass Python doch nicht so schwer ist.
Noch einmal vielen Dank
Axi
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Axi hat geschrieben:Hallu DaMutz,
Aber Deine Version hat mich überzeugt, dass Python doch nicht so schwer ist.
Noch einmal vielen Dank
Axi
Es bringt Dir ja nichts, in einer Sprache etwas entwickeln zu wollen, die Du nicht beherrscht! Bist Du also noch im Lernprozess oder willst Du zielorientiert etwas entwickeln? Bei letzterem würde ich dann ggf. eben bei der Sprache bleiben, die Du beherrschst.

Seine "Version" ist nichts anderes, als die Code-Fragmente meiner Konsolen-Session zusammenzupacken. Die Zeile zum Öffnen hatte ich auch so 1:1, die Erstellung einer Liste mit Integern ebenso - nur das Binden an einen Namen fehlte.

Das sind alles relativ triviale Dinge, die man nach Durchrabeiten des Tutorials verstehen könnte. Daher noch mal mein Appell: Arbeite das Tutorial durch und danach / dazu ggf. noch so etwas wie A Byte of Python und Konsorten. Eine Liste mit Lektüre für Einsteiger findet sich in der FAQ im wiki:
wiki.python-forum.de

Viel Erfolg weiterhin :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Axi
User
Beiträge: 16
Registriert: Freitag 23. Juli 2010, 18:03

Hallo Hyperion,
danke für deine Tipps.
Es ist immer so:Was für einen Könner trivial ist, ist für einen Anfänger nun mal schwerverdaulische Kost. Ich konnte nicht einmal erkennen, dass die beiden Versionen ähnlich sind. Mir schien deine Version als eine viel tiefer gehende Variante der Lösung zu sein, was natürlich tiefe Sachkenntnisse voraussetzt.
Ich habe allemal Respekt vor eurem Können. Ich werde deine Tipps beherzigen und mich weiter mit den Grundlagen beschöftigen.
Ich freue mich dass ich weitergekommen bin und danke dir und DaMurtz noch einmal für eure Mühe.
Axi
problembär

Zeig' doch mal bitte, wie Du das in C++ machen würdest.

Ich hab' früher häufiger versucht, sowas in C++ zu schreiben, hab' das aber nie mit vertretbarem Aufwand geschafft ...

Gruß
3ff
User
Beiträge: 191
Registriert: Dienstag 22. Dezember 2009, 12:54
Wohnort: Odenwald Sued-Hessen

@Axi,
das Beispiel von DaMutz ist
-einfach
-übersichtlich
-leicht nachzuvollziehen.
Das mußt Du natürlich "auf der Pfanne" haben, schau Dir gute Python-Tutorials an.
a[] ist eine Liste und a.append() ist die pythonfunktion zum Anhängen an eine (einfache)Liste.
Was allerdings die Übersichtlichkeit von Python angeht, da scheint mir 1 wichtiger Gesichtspunkt noch zu fehlen:
Im Gegensatz zu C und Cpp oder Fortran strukturiert Python den Code durch Einrücken des Codes.
Dadurch kommt man ohne { Klammern aus, was mich bei Cpp stört und die vielen reservierten Worte wie void volatile etc.
Wie DaMutz schon sagte, Python ist anders, aber bestimmt genauso leistungsfähig und weil es 1 Interpreter ist, wird der Code schneller geladen. Es fehlt ja die Übersetzungszeit.
Natürlich kann man auch in Python Spaghetticode erzeugen, siehe oben.
Was USA angeht,ist Python die am schnellsten sich ausbreitende Sprache, obwohl Java den größten Marktanteil hat.
Dies Forum ist das einzige Pythonforum in DE und es ist gut.
Guude!
Fritz
8)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@Hyperion: Warum verwendest du nicht gleich map?

Code: Alles auswählen

In [2]: map(int, StringIO('0\n1\n2\n3\n4\n5\n6\n7\n8\n9'))
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben:@Hyperion: Warum verwendest du nicht gleich map?

Code: Alles auswählen

In [2]: map(int, StringIO('0\n1\n2\n3\n4\n5\n6\n7\n8\n9'))
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Das erschien mir für einen Einsteiger ein wenig zu viel des guten - dran gedacht hatte ich schon ;-)
Aber schön, dass Du es gezeigt hast. Demonstriert ja auch schön, wie ausdruckssatrk man in Python im Gegensatz zu C++ formulieren kann :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hyperion hat geschrieben:
jbs hat geschrieben:@Hyperion: Warum verwendest du nicht gleich map?

Code: Alles auswählen

In [2]: map(int, StringIO('0\n1\n2\n3\n4\n5\n6\n7\n8\n9'))
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Das erschien mir für einen Einsteiger ein wenig zu viel des guten - dran gedacht hatte ich schon ;-)
Aber schön, dass Du es gezeigt hast. Demonstriert ja auch schön, wie ausdruckssatrk man in Python im Gegensatz zu C++ formulieren kann :-)
Gewundert hatte ich mich darüber, dass du `map` davor benutzt hast und danach nicht mehr. Dafür führst du dann die LC ein ;)
[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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben: Gewundert hatte ich mich darüber, dass du `map` davor benutzt hast und danach nicht mehr. Dafür führst du dann die LC ein ;)
Hehe... das war ja nur für die Erstellung der Daten - ich hätte den Teil auch weglassen können beim Posting ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten