Python CSV писатель неправильный разделитель? - PullRequest
12 голосов
/ 15 сентября 2011

Отказ от ответственности: я в Европе.

Согласно этой странице 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').

Ответы [ 2 ]

17 голосов
/ 15 сентября 2011

Это потому, что диалект csv.excel не знает языковой стандарт. Если вы хотите явно использовать точки с запятой в качестве разделителя, вам нужно либо явно передать разделитель в csv.open как

writer = csv.writer(open("data.csv", "wb"), delimiter=";")

или создайте новый диалект и зарегистрируйте его

class excel_semicolon(csv.excel):
    delimiter = ';'
register_dialect("excel-semicolon", excel_semicolon)

В любом случае, вы должны проверить, как пишутся числа с плавающей запятой ... Я подозреваю, что они не будут записаны в желаемом вами европейском формате (с запятой в качестве радиуса)

6 голосов
/ 15 сентября 2011

Диалект 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...