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)