Array in Textdatei schreiben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du b'' ausgegeben bekommst, dann ist Deine Datei leer. Angeblich soll aber eine Zeile drin stehen.

Welches Beispiel?
Ein Beispiel, das eigentlich Dein gewünschtes Ergebnis liefern sollte:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)
vT[1, 0] = 1
vT[0, 1] = 2

with open("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')

with open('Hey.txt', 'rb') as data:
    print(data.read())
Was ist hier die Ausgabe?
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

@Sirius 3. Entschuldigung. Das die Datei leer ist, ist mein Fehler. Ich hab den Inhalt vor jeder Programmveränderung immer händisch gelöscht und wegen des Fehlers der mir ausgespuckt wurde, wurde ja nichts in die Datei reingeschrieben. Wenn ich jetzt nochmal zu dem Programm zurückgehe, welches mir die eine Zeile reinschreibt kommt folgendes raus: b'nan\t2.799999999999999822e+00\tnan\n1.100000000000000089e+00\tnan\tnan\n'

Die Ausgabe in die Texdatei sieht so aus: nan 2.799999999999999822e+00 nan1.100000000000000089e+00 nan nan

Da wo der Zeilenumbruch sein müsste, sind nan und 1,1 direkt aneinander.



Bei diesem Beispiel bekomme ich die Fhelermeldung:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)
vT[1, 0] = 1
vT[0, 1] = 2

with open("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter='\t')
    

Wenn ich folgenden Code laufen lasse:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)
vT[1, 0] = 1
vT[0, 1] = 2

with open("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')

with open('Hey.txt', 'rb') as data:
    print(data.read())
    
bekomme ich erneut folgende Fehlermeldung: TypeError: Mismatch between array dtype ('float64') and format specifier ('%1.4f %1.4f %1.4f')
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ConanDerBarbar: Wie man sieht sind in der Datei eindeutig zwei Zeilenendezeichen. Also bleibt die Frage wie *Du* das überprüfst. Etwa Notepad? Dann ist *das* das Problem. Nimm einen vernünftigen Editor.

Bei mir läuft das Programm von Sirius3 problemlos durch und liefert folgende Ausgabe:

Code: Alles auswählen

b'nan\t2.0000\tnan\n1.0000\tnan\tnan\n'
Also genau das was man erwarten würde.

Selbst wenn ich den `dtype` beim erstellen von `vT` explizit als `np.float64` angebe, bekomme ich nicht die Fehlermeldung. Kannst Du davon mal bitte den kompletten Traceback zeigen und nicht nur die letzte Zeile?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

@__blackjack__ ich verwende kein Notepad. Um das Programm zu schreiben verwende ich Spyder und um mir die Texdatei anzusehen, einfach den Windows-integrierten Editor.

Der Traceback für folgendes Programm:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)
vT[1, 0] = 1
vT[0, 1] = 2

with open("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')

with open('Hey.txt', 'rb') as data:
    print(data.read())
    
sieht wie folgt aus:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-40-9af716c21d41>", line 1, in <module>
    runfile('C:/Users/canan/Desktop/untitled0.py', wdir='C:/Users/canan/Desktop')

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/canan/Desktop/untitled0.py", line 15, in <module>
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1162, in savetxt
    % (str(X.dtype), format))

TypeError: Mismatch between array dtype ('float64') and format specifier ('%1.4f	%1.4f	%1.4f')
Für folgendes Programm:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)

vT[1, 0] = 1.1
vT[0, 1] = 2.8

with open ("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter = '\t', newline = '\n')
    
ist der Traceback:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-41-9af716c21d41>", line 1, in <module>
    runfile('C:/Users/canan/Desktop/untitled0.py', wdir='C:/Users/canan/Desktop')

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/canan/Desktop/untitled0.py", line 37, in <module>
    np.savetxt(doc, vT, delimiter = '\t', newline = '\n')

  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1162, in savetxt
    % (str(X.dtype), format))

TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e	%.18e	%.18e')
Ich habe jetzt das fmt rausgenommen bei dem zweiten Programm, mit dem ich davor rumexperimentiert habe, weshalb der Fehler jetzt einen anderen format specifier hat.


Ich danke euch beiden schonmal für eure Hilfe bis jetzt!
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer mich funktioniert dein zweites Programm so wie gezeigt ohne Fehler und produziert den erwarteteten Output. Das ist allerdings unter Linux. *Sollte* aber keinen Unterschied machen.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ConanDerBarbar: der in Windows integrierte Editor ist notepad.exe und der ist Mist, obwohl Python eigentlich bei Text-Dateien unter Windows automatisch die richtige Zeilenendung schreiben sollte, ist vielleicht irgendeine Spyder-Geschichte.

Und die Fehlermeldung gehört eindeutig nicht zu dem gezeigten Programm, denn dort ist die Ausgabe in Zeile 8 und nicht in Zeile 15 bzw. 37, wie im Traceback angegeben.
Bitte zeige exakt den Code den Du ausführst, sonst macht das Herumraten hier keinen Sinn.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ConanDerBarbar: Der in Windows ”integrierte” Editor ist doch *Notepad*. Nimm einen anderen!

Wie sieht's denn aus wenn Du das Programm mal ausserhalb von der IDE startest?

Edit: Ergänzend zu Sirius3's Anmerkung zu den nicht passenden Zeilennummern – bei Spyder auch unbedingt das Programm in einem neuen, frischen Kernel ausführen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

@Sirius3
Ich habe das Programm eigentlich einmal laufen lassen und dann die Fehlermeldung rauskopiert. Ich habe es jetzt einfach nochmal in einer neuen Konsole gemacht. Ich glaube aber das mit den Teilen liegt daran dass der Code nicht ganz oben steht. Er ist mitten im Skript. Habe jetzt einfach nochmal den Code in die erste zeile Verschoben.

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)

vT[1, 0] = 1.1
vT[0, 1] = 2.8

with open ("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter = '\t', newline = '\n')
Mit folgender Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1158, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: write() argument must be str, not bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\canan\Desktop\untitled0.py", line 9, in <module>
    np.savetxt(doc, vT, delimiter = '\t', newline = '\n')
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1162, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('float64') and format specifier ('%.18e	%.18e	%.18e')

Und hier das Andere:

Code: Alles auswählen

import numpy as np

vT = np.full((2,3), np.nan)
vT[1, 0] = 1
vT[0, 1] = 2

with open("Hey.txt", 'a') as doc:
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')

with open('Hey.txt', 'rb') as data:
    print(data.read())
mit dem Traceback:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1158, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: write() argument must be str, not bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\canan\Desktop\untitled0.py", line 8, in <module>
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1162, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('float64') and format specifier ('%1.4f	%1.4f	%1.4f')


@__blackjack__: Es muss der Editor von Windows genommen werden. Wenn das ganze Programm fertig ist (ist sehr viel größer) muss diese Textdatei von verschiedenen Leuten weiterverarbeitet werden. Und leider ist auf den meisten Computern (meines Wissens nach) als einfacher Texteditor halt eben der windows editor vorinstalliert. Und selbst wenn nicht, wissen es die meisten nicht. Ich habe also keine Wahl. Es muss dort drinnen richtig angezeigt werden...

Wenn ich das Programm aus der Konsole starte, kommt wieder die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1158, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: write() argument must be str, not bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "untitled0.py", line 8, in <module>
    np.savetxt(doc, vT, delimiter='\t', fmt='%1.4f')
  File "C:\Users\canan\Desktop\WinPython-64bit-3.5.3.1Qt5\python-3.5.3.amd64\lib\site-packages\numpy\lib\npyio.py", line 1162, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('float64') and format specifier ('%1.4f        %1.4f   %1.4f')
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

@__deets__ habe es gerade unter Linux ausprobiert. funktioniert ohne Probleme, mach genau das was es soll...

Scheint dann wohl ein Problem unter Windows zu sein..
da ich sowieso auf Linux programmiere, wäre mein Problem damit erstmal gelöst. Hab nur auf dem Windows die ganze Zeit das Programm laufen, weil ich die Tastatur angenehmer finde die ich da habe. Wieder was gelernt. Sollte Beispielprogramme nur auf dem Betriebssystem laufen lassen für das sie gedacht sind...
Dennoch komisch dass es unter windows nicht läuft. Die Fehlermeldung kann ja auch nicht so viel mit dem Editor zu tun haben, also muss es an windows liegen. Hab das Programm auch auf einem zweiten Windows Rechner laufen lassen und da kommen wieder die Fehlermeldungen. Mit Spyder auf Linux läuft es aber wie ein schurrendes Kätzchen.

Ich bedanke mich bei allen für die Hilfe!
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ConanDerBarbar: Das kann durchaus auch irgendwie an Spyder liegen. Aber eventuell auch an den Versionen die da verwendet werden. Python 3.5 ist ja nun schon etwas älter, und welche Numpy-Version wird da verwendet? Denn die Stelle mit dem `str` vs. `bytes` kommt in meinem Numpy `savetxt()` nicht (mehr) vor. Die Unterstützen soweit ich weiss seit Anfang des Jahres auch nur noch Python 3, so dass solche Sonderbehandlungen nicht mehr nötig sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ConanDerBarbar
User
Beiträge: 19
Registriert: Donnerstag 21. März 2019, 00:52

@__blackjack__ hab es in Windows mit Python 3.5 und einer neueren Version (weiß gerade nicht welche) ausprobiert. Numpy ist einfach mitinstalliert worden bei der instalation von Spyder, also genau wie das Programm über 2 Jahre alt. Auf meinem anderen Laptop ist halt beides vor einem halben Jahr installiert wurden. Mit den unterschiedlichen Versionen hab ich auch immer wieder das Phänomen, dass bestimmte Codeschnipsel auf der neueren Version nicht Funktionen, aber auf der älteren. Und allgemein ist auf meinem anderen Laptop (der neueren Spyder und Python Version) das Programm ziemlich instabil und hängt sich gerne auf oder stürzt ab. Manchmal funktionieren Programme auch erst nach einem Neustart von Spyder oder meinem Laptop. Habs schon mehrmals deinstalliert und neu installiert von unterschiedlichen Plattformen. hab da mehrere Versionen ausprobiert. Aber anscheinend verträgt sich mein anderer Laptop weder mit Sypder, noch Visual Studio.

Lange Rede, kurzer Sinn: Ist also gut möglich, dass auf der Python und Spyder Version meines anderen Laptops das Programm eigentlich funktioniert, nur mein Laptop einfach nicht wollte.
Antworten