.txt Datei einlesen und verwenden

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
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

Guten Abend!
Ich arbeite jetzt seit 10 Wochen mit Python. Bin zwar Neuling in der Programmierung, hab mich aber durch die Tutorials durchgekämpft. Ich benutze ein mathematisches Zusatzmodul Pywafo, was auch soweit läuft. Allerdings will ich jetzt nicht eine Datei aus der Pywafo-Bibliothek verwenden, sondern eine aus einem bestimmten Speicherplatz. Zum Aufrufen der Datei verwende ich den Befehl "f = open (r"Speicherort"). Ich weiß bis dato, dass man die Wahl zwischen r=read und w=write hat. Allerdings bekomme ich immer eine Fehlermeldung sobald ich die Datei nach dem Einlesen verwende. Gibt es dafür eine elegante Lösung?

Ich wäre sehr dankbar für Hilfe!

>>> import wafo
>>> f = open (r"C:\Anaconda\TGT.txt")
>>> x = f
>>> y = wafo.misc.rfcfilter (x[:,1], h=0, method=1)

Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
y = wafo.misc.rfcfilter (x[:,1], h=0, method=1)
TypeError: 'file' object has no attribute '__getitem__'
BlackJack

@GT1749VA: `f` ist ein Dateiobjekt und damit ist `x` auch ein Dateiobjekt, nämlich *das selbe*. Was soll denn diese Zuweisung? Auf jeden Fall kann man bei Dateiobjekten nicht mit ``[]`` auf Elemente zugreifen. Die haben nur die in der Dokumentation beschriebenen Methoden und man kann darüber iterieren — dabei erhält man die einzelnen Zeilen der Datei als Zeichenketten.

Der Indexzugriff sieht aus als würde `rfcfilter()` ein Numpy-Array erwarten. Also musst Du da auch so ein Objekt übergeben. Wie man das aus dem Inhalt einer Datei erstellt kommt auf den Inhalt der Datei an. Numpy bietet da einige Funktionen, `loadtxt()` und `genfromtxt()` beispielsweise. Musst halt sehen was sich da am besten für Deine Daten eignet.
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

@BlackJack: Vielen Dank für deine schnelle Antwort. Ich bin mir bewusst, dass die Zuweisung x = f keinen Sinn macht, da es das Gleiche ist. Es dient nur zu meiner Übersicht.

Wo kann ich denn in der Dokumentation von Numpy mich über die beiden Befehle ("loadtxt", "genfromtxt") belesen? Kann ich bei den Befehlen auch auf einen expliziten Speicherort zugreifen?

Ich muss zwei unterschiedliche Eingangsdateien verwenden und sie miteinander vergleichen. Es handelt sich dabei lediglich um eine einspaltige Aufzählung von Werten.

Vielen Dank!
BlackJack

@GT1749VA: Man sucht sich in der NumPy Reference ein entsprechendes thematisches Kapitel wo diese Funktionen eventuell drinstehen könnten (zum Beispiel „Array creation routines” oder „Input and output” enthalten die beide) oder wenn man die Funktionsnamen schon kennt kann man auch über den Index gehen der auf den Seiten der Referenzdokumentation oben rechts verlinkt ist.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

GT1749VA hat geschrieben:Wo kann ich denn in der Dokumentation von Numpy mich über die beiden Befehle ("loadtxt", "genfromtxt") belesen
http://docs.scipy.org/doc/numpy/referen ... adtxt.html
http://docs.scipy.org/doc/numpy/referen ... omtxt.html
GT1749VA hat geschrieben:Kann ich bei den Befehlen auch auf einen expliziten Speicherort zugreifen?
Was meinst Du mit Speicherort?
Die Funktionen brauchen einen Dateipfad (relativ oder absolut).

Hier zwei Numpy Quickstarts:
http://cs231n.github.io/python-numpy-tutorial
http://www.labri.fr/perso/nrougier/teac ... numpy.html
a fool with a tool is still a fool, www.magben.de, YouTube
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

MagBen hat geschrieben:
GT1749VA hat geschrieben:Wo kann ich denn in der Dokumentation von Numpy mich über die beiden Befehle ("loadtxt", "genfromtxt") belesen
http://docs.scipy.org/doc/numpy/referen ... adtxt.html
http://docs.scipy.org/doc/numpy/referen ... omtxt.html

Auf der Seite war ich auch schon, hatte aber nichts gefunden, wo ich meinen Dateipfad angeben kann :| .

Das ist super, dass sie einen Dateipfad brauchen. Wiegesagt finde ich nicht welche, ich nenn es mal Variable, meinen Dateipfad angibt. Würde es einfach mal gerne ausprobieren wollen. Müsste dann ja einfach über numpy.loadtxt (fname,...) funktionieren. Nur wie geb ich meinen Dateipfad an (C:\Anaconda\TGT.txt)?

Vielen Dank. Ich weiß Anfängerfragen sind nervig!
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@GT1749VA: Du kannst den Dateinamen als ersten Parameter angeben, alle anderen sind optional.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um es mal in Code zu fassen:

Code: Alles auswählen

numpy.loadtxt("C:\Anaconda\TGT.txt")
Werte, die du einer Funktion uebergibst heissen "Parameter", der Name der in der Dokumentation steht ist an der Stelle erstmal unwichtig, soll heissen du musst _nicht_ folgendes machen:

Code: Alles auswählen

fname = "C:\Anaconda\TGT.txt"
numpy.loadtxt(fname, ....)
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

Vielen Dank an @Sirius3 und @cofi!! Hat soweit funktioniert :).

Für mein Programm brauche ich einen prozentualen Vergleich zweier Signale. Ich bin gerade dabei ein bestehendes Programm (DIAdem-VBS-Script) 1:1 in Python umzusetzen. Ich habe ein Kanal mit den Soll- und einen mit den Ist-Werten. Geplant war es die Vektorsumme beider klassierter Kanäle zu berechnen und dann dem prozentualen Vergleich zu unterziehen. Leider funktioniert das ganze noch nicht. Ich stehe mathematisch auf dem Schlauch. In dem Ausgangsprogramm wird das Ergebnis so berechnet.

>>> import numpy
>>> import wafo
>>> x = numpy.genfromtxt ("C:\Anaconda\Target.txt")
>>> y = wafo.misc.rfcfilter (x[:,1], h=0, method=1)
>>> w = numpy.genfromtxt ("C:\Anaconda\Target.txt")
>>> z = wafo.misc.rfcfilter (w[:,1], h=0, method=1)
>>> TGT = numpy.ndarray.sum (y)
>>> IST = numpy.ndarray.sum (z)
>>> SB = (IST/TGT)*100

Warning (from warnings module):
File "__main__", line 2
RuntimeWarning: invalid value encountered in double_scalars

Eigentlich sollte bei diesem Vergleich 100 rauskommen, also komplette Übereinstimmung, da gleiches Eingangssignal. Das hab ich mit einer Datei aus der Wafo-Bib. auch hinbekommen, aber noch nicht über numpy.genfromtxt.

Falls es keiner weiß, bin ich ab dato ruhig :D und bedanke mich recht herzlich für die Hilfe!!
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@GT1749VA: in welcher Zeile tritt die Warnung genau auf? Enthält die Text-Datei noch irgendwelche Header-Zeilen?

Es heißt übrigens

Code: Alles auswählen

target = y.sum()
actual = z.sum()
und was SB heißen soll, habe ich keine Ahnung. Versuche möglichst aussagekräftige Namen und keine Abkürzungen zu verwenden.
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

@Sirius3: Die Fehlermeldung tritt genau auf, wenn ich den Parameter SB berechne. Steht bei mir für Schädigungsberechnung. Lese ich die gleiche Datei ein kommt keine Fehlermeldung, aber als Ergebnis bei "print SB" "nan" :| .
Nein beide Dateien besitzen keine Header-Zeilen. Spalte 1 sind die Zahlen von 1 bis 159744 und Spalte 2 die entsprechenden Messwerte.
BlackJack

@GT1749VA: Dann müsstest Du Dir mal die Zwischenergebniss anschauen ob da etwas unerwartetes kommt. Und vielleicht mal `loadtxt()` verwenden ob das denn überhaupt fehlerfrei funktioniert.
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

@BlackJack: "loadtxt" hab ich auch schon ausprobiert, aber dann sagt er mir: "could not convert string to float". Es funktioniert bei mir nur mit "genfromtxt". Ich bin schon zufrieden soweit wie das Programm ist.

Vielen Dank an alle!!
BlackJack

@GT1749VA: Ja aber genau da kommt doch dann der Fehler her: Deine Datei enthält was was sich nicht als Zahl interpretieren lässt. `genfromtxt()` macht daraus dann `nan` was Dir im weiteren Verlauf dann auf die Füsse fällt. Fehler ignorieren geht hier nicht gut.
GT1749VA
User
Beiträge: 7
Registriert: Mittwoch 26. August 2015, 18:37

@BlackJack: Habe die Dateien nochmal durchgesichtet, aber sie enthalten wirklich lediglich Zahlen. Das Einzige was ich mir erklären könnte, dass dem Interpreter die Messwerte gefallen, da sie mit Komma angegeben sind (also 21,4347). Eventuell liegt es daran und ich müsste sie mit Punkt angeben.
BlackJack

@GT1749VA: Genau daran dürfte es liegen. Also entweder mit Punkt angeben oder beim `converters`-Argument eine Funktion für die Spalte angeben die so eine Zahl in ein `float` umwandelt.
JanInfoHD
User
Beiträge: 16
Registriert: Montag 17. August 2015, 17:48

Mach das ganze doch mit dem Modul "os":
import os
Lesen:

Code: Alles auswählen

x = open("Hallo.txt","r")
for line in x:
    print line.rstrip()
x.close()
x könntest du dananch beliebig verwenden
Hier gibt es mehr Info´s:
http://www.python-kurs.eu/dateien.php
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und wozu braucht man dazu das ``os`` Modul? Davon abgesehen sollte man Dateien mittels ``with open (...) as handle`` öffnen. Wie ich die verlinkte Ressource einschätze wird dort davon nichts erzählt... insofern braucht man das auch nicht verlinken! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@JanInfoHD: GT1749VA braucht ein Numpy-Array mit den Daten aus der Datei. Da ist es wirklich einfacher die dafür vorgesehenen Numpy-Funktionen zu verwenden als sich so eine Funktion noch mal selber zu programmieren.
Antworten