Frage zur Datei Ein-/Ausgabe

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
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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'
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

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
Zuletzt geändert von TryToLearn am Donnerstag 10. Juli 2014, 13:07, insgesamt 1-mal geändert.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Also kann ich das mit Befehlen wie readlines() nicht lösen, sondern muss den Weg über read() gehen?
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

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
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

aber nach split hast du wieder eine Liste das ist dir hoffentlich klar
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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:

Code: Alles auswählen

[['3', '2', '1'], ['2', '4', '2'], ['8', '9', '7']]
Wie mache ich das möglichst effizient, jetzt auf jede liste dort zuzugreifen und die in ein 3-Tupel mit int-Werten umzuwandeln?
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

duodiscus hat geschrieben:

Code: Alles auswählen

[['3', '2', '1'], ['2', '4', '2'], ['8', '9', '7']]
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@duodiscus: Die Frage ist aber auch warum Du überhaupt die Zeilenendezeichen entfernen möchtest wenn die bei einem `split()` ohne Argumente sowieso verschwinden:

Code: Alles auswählen

In [17]: 'a b\n'.split()
Out[17]: ['a', 'b']
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]
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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.
TryToLearn
User
Beiträge: 39
Registriert: Freitag 6. Juni 2014, 13:44

@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
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.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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).
Antworten