2011-09-14 18 views
10

Nota prawna: Jestem w Europie.Python csv writer wrong separator?

Zgodnie z this page program Excel używa średnika ; jako domyślnego separatora w Europie, aby "zapobiegać konfliktom" za pomocą przecinka dziesiętnego.

Teraz mam ten kod Pythona:

import csv 

data = [["test", "data"], ["foo", "bar"]] 
writer = csv.writer(open("data.csv", "wb"), dialect="excel") 
writer.writerows(data) 

Który powinien wygenerować ten plik

test;data 
foo;bar 

ale zamiast tego używa przecinków. Dlaczego to się dzieje? locale.getdefaultlocale() zwraca ('nl_NL', 'cp1252').

+3

Nie rozumiem słowa w dół. Jest to istotny problem, pokazuje wysiłek badawczy, a rozwiązanie nie jest tak oczywiste. –

+0

Różne niepowiązane pytania: Czy przeczytałeś czwartą odpowiedź na "tej stronie", którą cytowałeś? Kim są przeznaczeni użytkownicy tego pliku SSV - ludzie lub komputery? Co oni z tym zrobią? Czy zastanawiałeś się nad napisaniem pliku XLS lub XLSX (który może być ustawiony na agnostykę lokalną, z zachowaniem ostrożności)? –

Odpowiedz

16

To dlatego, że dialekt csv.excel nie jest świadoma locale. Jeśli chcesz jawnie użyć średników jako ogranicznik to trzeba jawnie przekazać separator do csv.open jak

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

lub utworzyć nowy dialekt i zarejestrować go

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

W każdym przypadku, powinieneś przetestować, w jaki sposób zapisywane są liczby zmiennoprzecinkowe ... Podejrzewam, że nie będą one napisane w pożądanym formacie europejskim (z przecinkiem jako podstawą).

6

excel dialekt jest określona przez następujące atrybuty (w Lib/csv.py, line 57):

delimiter = ',' 
quotechar = '"' 
doublequote = True 
skipinitialspace = False 
lineterminator = '\r\n' 
quoting = QUOTE_MINIMAL 

widzę żadnej wskazówki, że jest w jakiś sposób zależne od ustawień lokalnych - stąd zawsze otrzymasz , z domyślnym dialekt.

Ale to łatwo naprawić, np.

class excel_semicolon(csv.excel): 
    delimiter = ';' 

writer = csv.writer(open("data.csv", "wb"), dialect=excel_semicolon) 
+0

Pewnie, że jest łatwa do naprawienia, ale założyłem, że jeśli Python zawrze edytor Excela, to zaimplementuje go poprawnie = S – orlp

+0

@miku: -1. Po twoim drugim stwierdzeniu, 'csv.excel.delimiter' odnosi się do' ';' 'zamiast' ', ''. Przeczytaj odpowiedź @Donkopotamus. –

+0

@John, dzięki, poprawiono. – miku