python - mercado - web scraping con selenium
¿Cómo puedo desactivar las citas en el lector Python 2.4 CSV? (3)
+1 por tríptico
Confirmación de que csv.reader maneja automáticamente archivos csv sin comillas:
>>> import StringIO
>>> import csv
>>> data="""
... 1,2,3,4,5
... 1,2,3,4,5
... 1,2,3,4,5
... """
>>> reader=csv.reader(StringIO.StringIO(data))
>>> for i in reader:
... print i
...
[]
[''1'', ''2'', ''3'', ''4'', ''5'']
[''1'', ''2'', ''3'', ''4'', ''5'']
[''1'', ''2'', ''3'', ''4'', ''5'']
Estoy escribiendo una utilidad de Python que necesita analizar un archivo CSV grande y regularmente actualizado que no controlo. La utilidad debe ejecutarse en un servidor con solo Python 2.4 disponible. El archivo CSV no cita valores de campo en absoluto, pero la versión Python 2.4 de la biblioteca csv no parece darme ninguna manera de desactivar las comillas, solo me permite establecer el carácter de comillas ( dialect.quotechar = ''"''
o lo que sea). Si trato de configurar el carácter de cita en None
o en la cadena vacía, aparece un error.
Puedo solucionar este problema estableciendo dialect.quotechar
en algún carácter "raro", pero esto es frágil, ya que no hay carácter ASCII, puedo garantizar que no aparecerá en los valores de campo (excepto el delimitador, pero si configuro dialect.quotechar = dialect.delimiter
, las cosas van predeciblemente descontroladas).
En Python 2.5 y posterior , si configuro dialect.quoting
en csv.QUOTE_NONE
, el lector de CSV respeta eso y no interpreta ningún carácter como carácter de cita. ¿Hay alguna forma de duplicar este comportamiento en Python 2.4?
ACTUALIZACIÓN : Gracias Tríptico y Mark Roddy por ayudar a reducir el problema. Aquí hay una demostración de caso más simple:
>>> import csv
>>> import StringIO
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data))
>>> for i in reader: print i
...
[]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
_csv.Error: newline inside string
El problema solo ocurre cuando hay un solo carácter de comillas dobles en la columna final de una fila. Lamentablemente, esta situación existe en mi conjunto de datos. Acepté la solución de Tanj: asigne manualmente un carácter no imprimible ( "/x07"
o BEL
) como carátula. Esto es chiflado, pero funciona, y todavía no he visto otra solución que lo haga. Aquí hay una demostración de la solución en acción:
>>> import csv
>>> import StringIO
>>> class MyDialect(csv.Dialect):
... quotechar = ''/x07''
... delimiter = '',''
... lineterminator = ''/n''
... doublequote = False
... skipinitialspace = False
... quoting = csv.QUOTE_NONE
... escapechar = ''//'
...
>>> dialect = MyDialect()
>>> data = """
... 1,2,3,4,"5
... 1,2,3,4,5
... """
>>> reader = csv.reader(StringIO.StringIO(data), dialect=dialect)
>>> for i in reader: print i
...
[]
[''1'', ''2'', ''3'', ''4'', ''"5'']
[''1'', ''2'', ''3'', ''4'', ''5'']
En Python 2.5+ la configuración para csv.QUOTE_NONE sería suficiente, y el valor de quotechar
sería entonces irrelevante. (Estoy obteniendo mi dialecto inicial a través de un csv.Sniffer
y luego anulando el valor de quotechar, no csv.Dialect
, pero no quiero que eso sea una distracción del problema real; las dos sesiones anteriores demuestran que Sniffer
no es el problema.)
No sé si Python le gustaría / lo permitiría, pero podría usar un código ascii no imprimible como BEL o BS (retroceso). Estos serían extremadamente raros.
Probé algunos ejemplos usando Python 2.4.3, y parecía lo suficientemente inteligente como para detectar que los campos no se habían citado.
Sé que ya has aceptado una respuesta (ligeramente hacky), pero ¿has intentado simplemente dejar solo el valor de reader.dialect.quotechar
? que pasa si tu lo haces?
¿Alguna posibilidad de que podamos obtener una entrada de ejemplo?