2011-09-14 22 views
10

Disclaimer: I'm in Europe.Separatore errato di csv writer Python?

Secondo this page Excel utilizza il punto e virgola ; come separatore predefinito in Europa per "prevenire conflitti" con la virgola decimale.

Ora, ho questo codice Python:

import csv 

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

Quale dovrebbe generare questo file:

test;data 
foo;bar 

ma invece utilizza le virgole. Perché sta succedendo? locale.getdefaultlocale() restituisce ('nl_NL', 'cp1252').

+3

Non capisco il downvote. È un problema rilevante, mostra uno sforzo di ricerca e la soluzione non è così ovvia. –

+0

Varie domande non correlate: hai letto la quarta soluzione in "questa pagina" che hai citato? Chi sono i consumatori previsti di questo file SSV: persone o computer? Cosa faranno con esso? Hai pensato di scrivere un file XLS o XLSX (che può essere reso locale-agnostico, con cura)? –

risposta

16

Questo perché il dialetto csv.excel non è locale. Se si desidera utilizzare in modo esplicito e virgola come delimitatore, allora è necessario o passare esplicitamente il delimitatore di csv.open come

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

o creare un nuovo dialetto e registrarlo

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

In entrambi i casi, dovresti testare come vengono scritti i numeri in virgola mobile ... Sospetto che non saranno scritti nel formato europeo che desideri (con una virgola come la radice)

6

Il excel dialetto è specificato dai seguenti attributi (in Lib/csv.py, line 57):

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

non vedo alcun suggerimento, che questo è in qualche modo dipendente dal luogo - da qui avrete sempre , con il default dialetto.

Ma questo è facilmente risolto, ad es.

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

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

Certo che è stato risolto facilmente, ma ho pensato che se Python avesse incluso il dialetto excel lo avrebbe implementato correttamente = S – orlp

+0

@miku: -1. Dopo la tua seconda affermazione, 'csv.excel.delimiter' si riferisce a' ';' 'invece di' ',' '. Leggi la risposta di @Donkopotamus. –

+0

@ John, grazie, corretto. – miku

Problemi correlati