2011-01-20 35 views
10

Tengo un proceso donde se puede descargar, editar y luego cargar de nuevo un archivo CSV. En la descarga, el archivo CSV tiene el formato correcto, sin envoltura comillas doblesPython CSV: Quite las comillas del valor

1, someval, someval2 

cuando abro la CSV en una hoja de cálculo, editar y guardar, se agrega comillas dobles alrededor de las cuerdas

1, "someEditVal", "someval2" 

Pensé que esto era solo la acción de la hoja de cálculo (en este caso, openoffice). Quiero que mi script de carga elimine las comillas dobles de ajuste. No puedo eliminar todas las comillas, solo en el caso de que el cuerpo las contenga, y tampoco quiero simplemente verificar el primero y el último caracteres entre comillas dobles.

Im casi seguro que la biblioteca CSV en pitón sabría cómo manejar esto, pero no está seguro de cómo usarlo ...

EDITAR Cuando utilizo los valores dentro de un diccionario, que resultan de la siguiente

{'header':'"value"'} 

, gracias

+1

se consideran en general Las comillas que se le permitiera en archivos CSV. ¿Estás seguro de que tienes que eliminarlos? –

+0

Sí, estoy usándolos en un script de procesamiento poniéndolos en un diccionario, y salen así {'header': '"value"'} – neolaser

+0

Open Office calc 3.2 NO pone espacios después de las comas. Qué versión estás usando? –

Respuesta

12

Por ejemplo, que las siguientes obras:

import csv 
writer = csv.writer(open("out.csv", "wb"), quoting=csv.QUOTE_NONE) 
reader = csv.reader(open("in.csv", "rb"), skipinitialspace=True) 
writer.writerows(reader) 

Es posible que necesite jugar con las opciones de dialecto del lector y escritor CSV; consulte el documentation of the csv module.

+1

QUOTE_NONE funciona al descargar/crear el archivo CSV, ¡lo cual es genial! Pero mi problema es cuando edito el csv (que es donde se agregan las comillas dobles) y lo cargo nuevamente. ¡Gracias por la respuesta útil! – neolaser

+0

El código que proporcioné no es para analizar el archivo, sino para convertir el archivo "incorrecto" en uno "correcto". Si solo quieres leerlo, usa solo el lector, no el escritor. Tal vez solo necesitabas 'skipinitialspace = True'? –

+2

QUOTE_NONE NO es una buena idea si, como dice el OP, tiene '" 'en el contenido. –

6

Gracias a todos los que estaban tratando de ayudarme, pero lo descubrí. Al especificar el lector, se puede definir el quotechar

csv.reader(upload_file, delimiter=',', quotechar='"') 

Este se encarga de las cotizaciones de embalaje de cadenas.

+3

Los dos parámetros que pasa son solo los predeterminados, ¡simplemente puede omitirlos! Y esto no analizará los datos de ejemplo en su pregunta, esto solo funcionará con 'skipinitialspace = True'. –

+0

ah ok, gracias Sven! Omití esos params y todavía funciona, gracias por la ayuda. Usé el lector usando los parámetros predeterminados. Si desea publicar como respuesta, márquelo – neolaser

+0

Si esto funciona, no publicó los datos reales en su pregunta. En cuanto a los datos en la pregunta, esto no funciona. –

1

Para Python 3:

import csv 
writer = csv.writer(open("query_result.csv", "wt"), quoting=csv.QUOTE_NONE, escapechar='\\') 
reader = csv.reader(open("out.txt", "rt"), skipinitialspace=True) 
writer.writerows(reader) 

La respuesta original da este error bajo Python 3. También Ver este SO para el detalle: csv.Error: iterator should return strings, not bytes

Traceback (most recent call last): File "remove_quotes.py", line 11, in writer.writerows(reader) _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

+0

¿por qué hay '' rt''mode para 'writer' y' wt' para 'reader'? También creo que debes establecer 'escapechar' – Zangetsu

+0

@Zangetsu Esa es una buena decisión. Gracias por mencionarlo. Actualizaré la respuesta. –

Cuestiones relacionadas