Numpay Arrays und Kommentare in Textdatei speichern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

Hallo Zusammen,

ich habe zwei Numpy-arrays der Form (41, 4). Nun möchte ich beide Arrays in eine Textdatei speichern.
Zusätzlich sollen aber am Anfang der Datei vor dem ersten Array sowie zwischen dem ersten und zweiten Array noch Kommentar/ Textzeilen eingefügt werden. Bsp.:

Code: Alles auswählen

Datensatz xyz
Begin Daten 1
1, 2, 3, 4
5, 6, 7, 8
...
Begin Daten 2
7, 8, 9, 10
11, 12, 13, 14
...
Mit der Funktion numpy.savetxt() kann ich leider nur einen Array verarbeiten und dort kopf- und fußzeilen definieren. So fehlt mir aber der zweite Array bzw. wenn ich beide Arrays zu einem vereine, fehlt mir die Kommentarzeile zwischen beiden Arrays.

Nun habe ich mir übelegt die Kommentare und Arrays in eine Liste zusammenzufügen und diese elementweise in eine Textdatei zu schreiben. Hier stoße ich aber auf ein Problem, dass die Zeilen der Arrays mit 4 Elementen als '[1, 2, 3, 4]' in jede Zeile der Textdatei gespeichert werden, so dass ich hier nochmal alle Zeilen der Liste formatieren müsste, um am Ende in der Textdateizeile '1,2,3,4' zu erhalten.

Gibt es für mein Vorhaben einen eleganteren Lösungsweg? ggf. ohne die Arrays in Listen umzuwandeln?

Gruß Seb
BlackJack

@Kniffte: Ich habe es jetzt nicht ausprobiert, aber Du kannst `savetxt()` auch ein Dateiobjekt übergeben. Also sollte es möglich sein selbst eine Datei zum schreiben zu öffnen und diese als Argument an zwei `savetxt()`-Aufrufe zu übergeben.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@BlackJack:
Das Übergeben der geöffneten Datei an mehrere 'savetxt()' funktioniert. Danke

Code: Alles auswählen

import os

import numpy as np

def main():

    test_array = np.array([[1,2],[3,4],[5,6]])
    current_cwd = os.getcwd()
    file_name = "testfile.txt"
    opened_file = open(os.path.join(current_cwd, file_name), mode='wb')
    np.savetxt(opened_file, test_array, fmt='%-.5f', delimiter=',', newline='\n', 
                     header='Closed Arc Length\nBegin Curve 1\n', footer='Begin Curve 2\n', comments='')
    np.savetxt(opened_file, test_array, fmt='%-.5f', delimiter=',', newline='\n', comments='')

if __name__ == '__main__':
    main()
Jedoch hab ich jetzt das Problem, dass die '\n' ignoriert werden.
Ich vermute, dass es am 'binary mode' liegt. Wenn ich die Datei jedoch im 'text mode' öffne, dann erhalte ich folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):                                                                                            
  File "test.py", line 25, in <module>                                                                                        
    main()                                                                                                                    
  File "test.py", line 16, in main                                                                                            
    header='Closed Arc Length\nBegin Curve 1\n', footer='Begin Curve 2\n', comments='')                                       
  File "C:\Users\ssb\AppData\Local\Continuum\Anaconda3\lib\site-packages\numpy\lib\npyio.py", line 1147, in savetxt           
    fh.write(asbytes(comments + header + newline))                                                                            
TypeError: write() argument must be str, not bytes
Weiß jmd eine Lösung?
Zuletzt geändert von Anonymous am Dienstag 25. Oktober 2016, 13:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Kniffte: Werden die wirklich ignoriert oder erwartest Du einfach was anderes, nämlich \r\n statt \n?
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@BlackJack:
:) Oh man...wird doch nichts ignroriert. Danke nochmal :)
Aber was ich jetzt nicht verstehe:
Im Windows Texteditor zeigt er mir den Inhalt der Datei in einer Zeile an.
Im Codeeditor (bei mir Visual Studio Code) zeigt er die Zeilenumbrüche und Inhalt steht in mehreren Zeilen zu sehen.
Woran liegt das?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kniffte: Wie BlackJack schon geschrieben hat, liegt der Unterschied im Zeilenende: \r\n <-> \n. Während jeder benutzbare Editor mit beidem klar kommt, ist Notepad da etwas eigen. Will man das einigermaßen systemunabhängig haben, muß man statt "\n" einfach os.linesep benutzen, oder Notepad nicht benutzen.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Sirius3: Ok...verstanden. Danke für den Tipp :)
Antworten