readline

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.
KorFreier
User
Beiträge: 8
Registriert: Freitag 16. Januar 2009, 17:14
Wohnort: Hamburg

readline

Beitragvon KorFreier » Freitag 16. Januar 2009, 18:10

Hallo zusammen!

Ich bin neu in Python und will es verwenden um Inhalte von txt.-Dateien umzuformatieren. Jetzt hab ich ein Problem, das scheinbar simpel sein sollte, aber zu dem ich keine Lösung finde, daher nun eine vermutlich idiotische Frage:

Der ".readfile" Befehl funktioniert bei mir nicht so, wie im Python-Tutorium angegeben.

Mein Skript lautet

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: cp1252 -*-

from numpy import *

pfad = "./" # anpassen!!
dateiname = "zeilen.txt" # anpassen!!
datei = pfad + dateiname
data = open(datei, "r")
x = array(0)

for line in data:
    x = x+1
print "Habe", x , "Zeilen gezählt."

y = array(1)
zeilen =[]
while y < x:
    zeile = data.readline()
    zeilen.append(zeile)
    y = y + 1

print zeilen

data.close()


Die Textdatei hat folgenden Inhalt:

erste zeile
zweite zeile
letzte zeile


Die Ausgabe von IPython auf das Skript lautet:


Habe 4 Zeilen gezählt.
['', '', '']


Wieso stehen nicht die Zeilen der Textdatei in dem Output? Auch wenn ich das Beispiel genau so fundamental formuliere wie im Python Tutorium
(http://starship.python.net/crew/gherman/publications/tut-de/tut-de-21.pdf Seite 50) und direkt in IPython eingebe liefert .readline nie das versprochene Ergebnis...

Hat da jemand eine Ahnung an was das liegen könnte? Wäre sehr dankbar (weil stundenlanges Rumprobieren hinter mir)!

(P.S.: Und wenn ich schon mal Profis bemühe: wie kann man denn möglichst einfach in Python auf Spalten einer Textdatei zugreifen? Gibts da so etwas wie einen Befehl?)
Zuletzt geändert von KorFreier am Freitag 16. Januar 2009, 18:30, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Re: readline

Beitragvon numerix » Freitag 16. Januar 2009, 18:29

Hallo KorFreier,

ich empfehle an Stelle von stundenlangem Rumprobieren einen Blick ins Tutorial: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files

Vielleicht solltest du das eigentliche Problem mal von numpy lösen, denn das hat damit ja nichts zu tun.

Code: Alles auswählen

datei = open(dateiname)
zeilen = datei.readlines()
datei.close()
print zeilen


Das ist eine simple von mehreren Möglichkeiten, um das zu erreichen, was du möchtest. Die anderen Varianten - falls du Python >= 2.6 nutzt noch eine mehr - kannst du im Tutorial nachlesen.

Hilfreich wäre es, wenn du deinen Code künftig in Code-Tags setzt.

Was die Spalten angeht, so kannst du es entweder selbst zerlegen mit den Zeichenkettenmethoden die Python mitbringt oder z.B. das csv-Modul nutzen: http://docs.python.org/library/csv.html
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 16. Januar 2009, 19:58

Zudem noch ``readlines`` in den allermeisten Fällen schlicht unnötig ist, da man mit ``for`` direkt über eine Datei zeilenweise iterieren kann.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Freitag 16. Januar 2009, 20:39

Leonidas hat geschrieben:Zudem noch ``readlines`` in den allermeisten Fällen schlicht unnötig ist, da man mit ``for`` direkt über eine Datei zeilenweise iterieren kann.

Ergänzung: Mit readlines liest man die komplette Datei in den Speicher und nimmt entsprechend der Dateigröße viel Speicher weg.
abgdf

Beitragvon abgdf » Samstag 17. Januar 2009, 00:50

Mit readlines liest man die komplette Datei in den Speicher und nimmt entsprechend der Dateigröße viel Speicher weg.

... was bei den meisten Textdateien, etwa Konfigurationsdateien, und den heutigen Speichergrößen aber oft kein Problem ist.

Ich finde readlines immer noch sehr praktisch und - wie gesagt - in den meisten Fällen auch angemessen. Nur bei sehr großen Dateien muß man sich halt ausnahmsweise was anderes überlegen.

Gruß
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 17. Januar 2009, 01:34

abgdf hat geschrieben:
Mit readlines liest man die komplette Datei in den Speicher und nimmt entsprechend der Dateigröße viel Speicher weg.

... was bei den meisten Textdateien, etwa Konfigurationsdateien, und den heutigen Speichergrößen aber oft kein Problem ist.

Was schlicht unnötig ist, zudem man die Dateien sofern es Textdateien sind gerne in Unicode hätte und das dann locker mal zweimal bis viermal so viel Speicher verbraucht wie auf der Festplatte.

abgdf hat geschrieben:Ich finde readlines immer noch sehr praktisch und - wie gesagt - in den meisten Fällen auch angemessen.

In den meisten Fällen iteriert man Zeilenweise und da ist es nicht angemessen sondern schlicht unnütz und langsamer als direkt über das Dateiobjekt zu iterieren. Zudem es auch noch komplizierter ist als die schönere Lösung.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
KorFreier
User
Beiträge: 8
Registriert: Freitag 16. Januar 2009, 17:14
Wohnort: Hamburg

Beitragvon KorFreier » Montag 19. Januar 2009, 10:58

Liebe Leute,
vielen Dank für eure Antworten. Zumidest das von euch genannte Tutorial hat mich auf die Fährte geführt. Und auch die Anmerkung zur Unterscheidung zwischen readlines() und for line in... ist hilfreich. Allerdings war wohl der entscheidende Fehler bei mir folgender (nur zur Dokumentation für Leute mit dem gleichen Problem):

Solange das File geöffnet ist, kann man den Befehl readline() jeweils nur einmal bis zum Ende des Files (EOF) ausführen. Am Ende des Files gibt er nur noch leere Strings als Output an. Also: Hat man als "verwirrendes Ergebnis" leere Strings als Output (obwohl die zu lesende Datei nachgewiesenermaßen Zeilen mit Inhalt hat), so ist vermutlich das Erreichen des EOF das Problem. Beispielsweise hat das Nachahmen der Angaben aus dem (von mir genannten) Tutorium nicht funktioniert, weil ich das File nicht wieder geschlossen habe. Dann ist klar, warum da mit readline() nur noch leere Strings rauskommen.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Montag 19. Januar 2009, 14:00

Jein. Du kannst nur einmal über eine Datei iterieren (readline macht das auch), denn du schiebst quasi ein Lesezeichen durch den Text und merkst dir so wo du gerade bist. Hast du das Ende erreicht bleibt der Zeiger dann natürlich am Ende stehn.

Wenn du die Datei neu öffnest, dann wird auch der Zeiger zurückgesetzt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 19. Januar 2009, 14:20

cofi hat geschrieben:Wenn du die Datei neu öffnest, dann wird auch der Zeiger zurückgesetzt.

Besser noch: man kann mittels ``seek()`` auf Byte 0, also den Anfang zurückspulen ohne die Datei nochmal öffnen zu müssen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder