locale hin, locale her, was ist nun richtig?
Verfasst: Sonntag 2. Februar 2025, 11:14
Zugegeben habe ich das bisher nicht gebraucht und daher nur wenig mit beschaeftigt. Aktuell wandle ich string nach floar. Folgender Test:
Bei der csv sind die Nachkommastellen hinter einem ','(Komma) und die Tausender Trennzeichen mit einem '.'(Punkt), also de_DE konform. Das Umwandeln per float funktioniert damit nicht , nur per locale.atof. In dem Fall mit de_DE.utf8. Bei en_US kommen dann Zahlen mit Faktor 1000 multipliziert, das Gleiche mit umgekehrtem Format und de_DE, was ja auch logisch erscheint. Das Encoding der csv spielt dabei offenbar ueberhaupt keine Rolle, der Effekt ist immer der gleiche (selbst bei setlocale de_DE.utf8 mit ISO-8859-1 als Encoding).
Auf was bezieht sich die setlocale ueberhaupt? Einstellung in der Umgebung? Nur auf das Script zur Laufzeit bezogen? Nur auf locale.atof bezogen?
Warum funktioniert das Umwandeln per float in dem Fall nicht?
Was sagt das utf8 in de_DE.utf8 aus (s.O., scheint sich am eigentlichen Encoding nicht zu stoeren)?
Wenn ich nun die csv mal so oder mal so bekomme, wie kann ich das Format auf jeden Fall sicher erkennen und umwandeln?
Code: Alles auswählen
# test.csv
pos-x;pos-y;pos-z
23,009;-14,234;8,123
-1.298,55;0,6;4.233,776
Code: Alles auswählen
#!/usr/bin/env python
import locale
import csv
locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
def main():
x_collecrtion = []
with open('test.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile, delimiter=';')
for row in reader:
print(row['pos-x'], row['pos-y'], row['pos-z'])
x_collecrtion.append(locale.atof(row['pos-x']))
# x_collecrtion.append(float(row['pos-x']))
print(x_collecrtion)
if __name__ == '__main__':
main()
Auf was bezieht sich die setlocale ueberhaupt? Einstellung in der Umgebung? Nur auf das Script zur Laufzeit bezogen? Nur auf locale.atof bezogen?
Warum funktioniert das Umwandeln per float in dem Fall nicht?
Was sagt das utf8 in de_DE.utf8 aus (s.O., scheint sich am eigentlichen Encoding nicht zu stoeren)?
Wenn ich nun die csv mal so oder mal so bekomme, wie kann ich das Format auf jeden Fall sicher erkennen und umwandeln?