Seite 1 von 1
Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:03
von Axi
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!
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:15
von Hyperion
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().
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:30
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:34
von DaMutz
zeig mal dein jetzigen Programm (Quellcode), dann kann man dir auch helfen.
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:43
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:48
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 17:59
von Hyperion
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
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.
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 18:11
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 18:21
von DaMutz
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]
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 18:43
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 18:53
von Hyperion
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

Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 20:20
von Axi
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
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 20:46
von 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ß
Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 21:08
von 3ff
@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

Re: Textdatei einlesen
Verfasst: Sonntag 22. August 2010, 22:19
von jbs
@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]
Re: Textdatei einlesen
Verfasst: Montag 23. August 2010, 09:50
von Hyperion
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

Re: Textdatei einlesen
Verfasst: Montag 23. August 2010, 10:10
von jbs
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

Re: Textdatei einlesen
Verfasst: Montag 23. August 2010, 10:15
von Hyperion
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
