Python csv записывает неправильный разделитель?
Отказ от ответственности: я в Европе.
В соответствии с эта страница Excel использует точку с запятой ;
как разделитель по умолчанию в Европе для предотвращения конфликтов с десятичной запятой.
Теперь у меня есть этот код Python:
import csv
data = [["test", "data"], ["foo", "bar"]]
writer = csv.writer(open("data.csv", "wb"), dialect="excel")
writer.writerows(data)
Что должно генерировать этот файл:
test;data
foo;bar
но вместо этого он использует запятые. Почему это происходит? locale.getdefaultlocale()
возвращает ('nl_NL', 'cp1252')
.
Ответы
Ответ 1
Это связано с тем, что диалект csv.excel не является локальным. Если вы хотите явно использовать точки с запятой в качестве разделителя, вам нужно либо явно передать разделитель на csv.open, как
writer = csv.writer(open("data.csv", "wb"), delimiter=";")
или создать новый диалект и зарегистрировать его
class excel_semicolon(csv.excel):
delimiter = ';'
register_dialect("excel-semicolon", excel_semicolon)
В любом случае вы должны проверить, как записываются числа с плавающей запятой... Я подозреваю, что они не будут записаны в желаемом европейском формате (с запятой в качестве основы)
Ответ 2
Диалект excel
задается следующими атрибутами (в Lib/csv.py
, строка 57):
delimiter = ','
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\r\n'
quoting = QUOTE_MINIMAL
Я не вижу намека на то, что это как-то зависит от языка - поэтому вы всегда получите ,
с диалектом по умолчанию.
Но это легко фиксируется, например
class excel_semicolon(csv.excel):
delimiter = ';'
writer = csv.writer(open("data.csv", "wb"), dialect=excel_semicolon)