2011-09-14 20 views
10

Descargo de responsabilidad: Estoy en Europa.Python escritor csv separador incorrecto?

Según this page Excel utiliza el punto y coma ; como separador predeterminado en Europa para "evitar conflictos" con la coma decimal.

Ahora, tengo este código Python:

import csv 

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

cual debería generar este archivo:

test;data 
foo;bar 

pero en su lugar utiliza comas. ¿Por qué está pasando esto? locale.getdefaultlocale() devuelve ('nl_NL', 'cp1252').

+3

No entiendo el voto a la baja. Es un problema relevante, muestra un esfuerzo de investigación, y la solución no es tan obvia. –

+0

Varias preguntas no relacionadas: ¿Leyó la cuarta solución en "esta página" que citó? ¿Quiénes son los consumidores previstos de este archivo SSV: personas o computadoras? ¿Qué van a hacer con eso? ¿Ha considerado escribir un archivo XLS o XLSX (que puede hacerse de manera independiente del lugar, con cuidado)? –

Respuesta

16

Esto se debe a que el dialecto csv.excel no tiene en cuenta la configuración regional. Si desea utilizar explícitamente punto y coma como delimitador entonces necesita ya sea pasar explícitamente el delimitador a csv.open como

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

o crear un nuevo dialecto y registrarlo

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

En cualquiera de los casos, deberías probar cómo se escriben los números en coma flotante ... Sospecho que no se escribirán en el formato europeo que deseas (con una coma como base)

6

El dialecto excel se especifica mediante los siguientes atributos (en Lib/csv.py, line 57):

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

veo ningún indicio, de que esto es de alguna manera dependiente de la localización - de ahí que siempre obtendrá , con el valor por defecto dialecto.

Pero eso se soluciona fácilmente, p.

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

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

Claro que es fácil de arreglar, pero asumí que si Python incluía el dialecto excel, lo implementaría correctamente = S – orlp

+0

@miku: -1. Después de su segunda declaración, 'csv.excel.delimiter' se refiere a' ';' 'en lugar de '', ''. Lea la respuesta de @Donkopotamus. –

+0

@John, Gracias, corregido. – miku