Danke für eure Antworten, aber der Reihe nach:
Die Originaldatei braucht eine UTF16-Codierung, weil in der Titelzeile "oCelsius" verwendet wird. Bei den Datenzeilen ist mir aufgefallen, dass diese doppelt so viele wie angezeigte Zeichen enthalten. Diese zusätzlichen Zeichen werden nicht angezeigt, Python hat da nur rechteckige Kästchen angezeigt. Ich habe diesen Zeichen dann eingelesen und mit replace gegen nichts ('') ersetzt. Bei den Testdaten hat das auch funktioniert. Also war meine Überlegung, ich lese die Datei zeilenweise ein, entferne die überflüssigen Zeichen und kümmere mich dann um die weitere Verarbeitung. Das hat aber wie beschrieben nicht geklappt. Die Verarbeitung mit meinen code-Schnipseln klappt nur, wenn ich die Datei zuvor in LibreCalc als csv öffne und wieder speichere; dabei werden dann offenbar alle überflüssigen Zeichen entfernt. Das wäre dann der, leider etwas aufwendigere, Plan B, wenn eine direkte Verarbeitung nun gar nicht klappen sollte.
Mit dem Einlesen per csv-Funktion hatte ich mich nicht beschäftigt, weil ich - vermutlich falsch - davon ausgegangen bin, dass diese merkwürdigen Zeichen dabei auch nur Probleme verursachen würden.
Ich habe mir ein kleineres Testfile (Weasthercloud V832 2024-01_Teil.csv) manuell erzeugt, das nur die Titelzeile und vier weitere Datenzeilen enthält. Mit dem Code von snafu bekomme ich jetzt die Ausgabe in der Form "Spaltenname: Werte" hin, wobei allerdings nur drei der vier Zeilen angezeigt werden und am Ende eine Unicode-Fehlermeldung "UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x0a in position 0: truncated data" kommt. Hex 0a ist decimal 10 und damit ein line feed; der ist aber am Ende jeder Zeile vorhanden.
Da ich die erste Zeile ohnehin ersetzen möchte mit kürzeren Spaltennamen, z. B. ['Date/Time', 'TempIn', 'TempOut', 'Chill', 'DewIn', 'DewOut', 'HeatIn', 'HeatOut', 'HumIn', 'HumOut', 'WspHi', 'WspAvg', 'WDirAvg', 'Bar', 'Rain', 'RainRate', 'SolRad', 'UV'], stellt sich mir bei der csv.DictReader-Funktion die Frage, wie ich die erste Zeile überspringen kann. Und damit bin ich wieder bei meinem eingangs geschilderten Problem mit dem nicht erfolgreichen Schreiben der Datei. Ich habe es mit diesem Ansatz versucht,
Code: Alles auswählen
#!/usr/bin/env python3
FILENAME = "Weathercloud V832 2024-01_Teil.csv"
with open(FILENAME, encoding = 'UTF-16') as file_raw:
for line in file_raw:
print(line)
bekomme am Ende aber nur wieder einen Unicodeerror, diesmal "UTF-16 stream does not start with BOM". BOM, sagt mir die Recherche, ist Byte Order Mark und sollte bei UTF-16 entweder "FE FF" sein oder "FF FE", aber welche ist richtig und wie bekomme ich das in die Datei?
Ein zweiter Versuch mit
Code: Alles auswählen
#!/usr/bin/env python3
import csv
FILENAME = "Weathercloud V832 2024-01_Teil.csv"
with open(FILENAME, newline = '') as file_raw:
data_read = csv.reader(file_raw, delimiter = ';')
for row in data_read:
print(row)
produziert auch wieder einen Unicode-Fehler "UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 80: invalid start byte". Die Option "encoding" ist für csv.reader nicht vorgesehen. Habt ihr noch eine Idee, wie ich das angehen könnte?
Beste Grüße
Jürgen