Numpay Arrays und Kommentare in Textdatei speichern

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

Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon Kniffte » Dienstag 25. Oktober 2016, 09:37

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
Benutzeravatar
BlackJack
Moderator
Beiträge: 33041
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon BlackJack » Dienstag 25. Oktober 2016, 09:48

@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.
“Programs must be written for people to read, and only incidentally for machines to execute.” — Abelson & Sussman, SICP (preface to the first edition)
Kniffte
User
Beiträge: 47
Registriert: Dienstag 27. September 2016, 11:05

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon Kniffte » Dienstag 25. Oktober 2016, 12:30

@BlackJack:
Das Übergeben der geöffneten Datei an mehrere 'savetxt()' funktioniert. Danke
  1. import os
  2.  
  3. import numpy as np
  4.  
  5. def main():
  6.  
  7.     test_array = np.array([[1,2],[3,4],[5,6]])
  8.     current_cwd = os.getcwd()
  9.     file_name = "testfile.txt"
  10.     opened_file = open(os.path.join(current_cwd, file_name), mode='wb')
  11.     np.savetxt(opened_file, test_array, fmt='%-.5f', delimiter=',', newline='\n',
  12.                      header='Closed Arc Length\nBegin Curve 1\n', footer='Begin Curve 2\n', comments='')
  13.     np.savetxt(opened_file, test_array, fmt='%-.5f', delimiter=',', newline='\n', comments='')
  14.  
  15. if __name__ == '__main__':
  16.     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 BlackJack am Dienstag 25. Oktober 2016, 13:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 33041
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon BlackJack » Dienstag 25. Oktober 2016, 13:35

@Kniffte: Werden die wirklich ignoriert oder erwartest Du einfach was anderes, nämlich \r\n statt \n?
“Programs must be written for people to read, and only incidentally for machines to execute.” — Abelson & Sussman, SICP (preface to the first edition)
Kniffte
User
Beiträge: 47
Registriert: Dienstag 27. September 2016, 11:05

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon Kniffte » Dienstag 25. Oktober 2016, 14:25

@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: 6128
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon Sirius3 » Dienstag 25. Oktober 2016, 14:41

@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: 47
Registriert: Dienstag 27. September 2016, 11:05

Re: Numpay Arrays und Kommentare in Textdatei speichern

Beitragvon Kniffte » Dienstag 25. Oktober 2016, 14:49

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder