Seite 1 von 1
Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 12:58
von duodiscus
Kann mir jemand erklären warum es klappt mit dem split Befehl, die Zeilenumbrüche in diesem Beispiel zu entfernen:
Code: Alles auswählen
def Data(dateiname):
f=open('/Users/Documents/%s' %(dateiname), 'r')
gesamt = f.read()
print(gesamt)
gesamt_geteilt = gesamt.split(chr(10))
Data('test3')
>>>
3 2 1
2 4 2
8 9 7
Und wenn ich das mit f.readlines() mache NICHT?!? Dann kommt nämlich folgender Fehler:
Code: Alles auswählen
def Data(dateiname):
f=open('/Users/Documents/%s' %(dateiname), 'r')
gesamt = f.readlines()
print(gesamt)
gesamt_geteilt = gesamt.split(chr(10))
['3 2 1\n', '2 4 2\n', '8 9 7']
Traceback (most recent call last):
gesamt_geteilt = gesamt.split(chr(10))
AttributeError: 'list' object has no attribute 'split'
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:03
von TryToLearn
ja das liegt an dem befehl read oder readlines
read gibt den Inhalt der Datei als einen zusammenhängenden String zurück (Zeilenumbruch ist also \n)
readlines gibt eine Liste zurück inder jede Zeile einen Eintrag in der Liste hat und eine Liste hat keine Methode split
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:06
von duodiscus
Also kann ich das mit Befehlen wie readlines() nicht lösen, sondern muss den Weg über read() gehen?
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:09
von TryToLearn
kommt drauf an was du machen möchtest es wird mit beiden Befehlen funktionieren
aber wenn du wirklich nur die Zeilenumbrüche entfernen möchtest und den String dann so weiterverwenden dann ist der schnellere Weg read zu nehmen
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:12
von TryToLearn
aber nach split hast du wieder eine Liste das ist dir hoffentlich klar
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:22
von duodiscus
Also ich habe es jetzt so:
Code: Alles auswählen
def Data(dateiname):
f=open('/Users/Documents/%s' %(dateiname), 'r')
gesamt = f.read()
gesamt_geteilt = gesamt.split(chr(10))
liste = []
for i in gesamt_geteilt:
liste.append(i.split(' '))
print(liste)
Data('test3')
Und zwar stehen in jeder Zeile immer 3 Zahlen. Diese möchte ich auslesen aus der Datei. Danach möchte ich jeweils pro Zeile ein 3-Tupel aus den Werten erstellen.
Jetzt bekommen ich ja dieses ergebnis aus der Liste:
Wie mache ich das möglichst effizient, jetzt auf jede liste dort zuzugreifen und die in ein 3-Tupel mit int-Werten umzuwandeln?
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:30
von /me
duodiscus hat geschrieben:
Wie mache ich das möglichst effizient, jetzt auf jede liste dort zuzugreifen und die in ein 3-Tupel mit int-Werten umzuwandeln?
Am einfachsten läufst du über jede innere Liste und wendest die int-Funktion auf deren einzelne Elemente an.
Code: Alles auswählen
data = [['3', '2', '1'], ['2', '4', '2'], ['8', '9', '7']]
result = [tuple(map(int, row)) for row in data]
print(result)
Grundsätzlich sieht das aber so aus, als wolltest du zum Einlesen ohnehin das
csv-Modul verwenden.
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:58
von Hyperion
Außerdem solltest Du Dateien immer folgendermaßen öffnen:
Code: Alles auswählen
with open(...) as f:
# f ist hier Dein Dateiobjekt!
# es wird automatisch geschlossen; sogar in einem Fehlerfall
# und f sollte idR. einen besseren Namen bekommen!
@/me: Kann ``numpy`` solche Art von Dateien nicht elegant öffnen und parsen? Das wäre evtl. noch einfacher als das ``csv``-Modul. (Wobei man auch ohne das wesentlich eleganteren Code dafür schreiben könnte... ich sage nur *direktes* Iterieren über den Zeilen eines Dateiobjektes...)
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 13:59
von BlackJack
@duodiscus: Die Frage ist aber auch warum Du überhaupt die Zeilenendezeichen entfernen möchtest wenn die bei einem `split()` ohne Argumente sowieso verschwinden:
Letztendlich läuft das wohl auf so etwas hinaus:
Code: Alles auswählen
def read_data(dateiname):
with open(dateiname, 'r') as lines:
return [tuple(map(int, line.split())) for line in lines]
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 14:41
von /me
Hyperion hat geschrieben:@/me: Kann ``numpy`` solche Art von Dateien nicht elegant öffnen und parsen?
Möglich. Mit
numpy kenne ich mich allerdings nicht aus.
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 14:46
von duodiscus
Danke für Eure Hilfen. Ja ich kenne viele Funktionen nicht, die teilweise angewendet werden wie z.b. 'map'. Es geht eigentlich nur darum, das man sich die split funktion genauer anschaut und daten aus dateien vernünftig zuordnen kann und ablegt.
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 14:59
von TryToLearn
@duodiscus: die Funktionen, die du nicht kennst kannst du ja in der Dokumentation nachschlagen
https://docs.python.org/2/contents.html
bzw
https://docs.python.org/3.5/contents.html
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 15:15
von BlackJack
In der Dokumentation ist auch der Index sehr praktisch wenn man Dokumentation zu einem bestimmten Namen sucht. Auf den meisten Seiten in der Doku ist oben rechts ein Link zum Index.
Re: Frage zur Datei Ein-/Ausgabe
Verfasst: Donnerstag 10. Juli 2014, 15:27
von snafu
Die 3.5 ist im Alpha-Status. Wenn du auf die aktuelle 3.x-Version verlinken willst, dann reicht ein "
http://docs.python.org/3/deine_seite.html" (führt momentan zu Version 3.4).