graficar - save to csv python
CSV en Python agregando un retorno de carro adicional (7)
En Python 2.7 ejecutándose en Windows XP pro:
import csv
outfile = file(''test.csv'', ''w'')
writer = csv.writer(outfile, delimiter='','', quoting=csv.QUOTE_MINIMAL)
writer.writerow([''hi'',''dude''])
writer.writerow([''hi2'',''dude2''])
outfile.close()
Genera un archivo, test.csv, con un / r / n extra en cada fila, así:
test.csv
hi,dude/r/r/nhi2,dude2/r/r/n
en lugar de lo esperado:
hi,dude/r/nhi2,dude2/r/n
¿Por qué está sucediendo esto o es este el comportamiento deseado?
En Python 3 (no he probado esto en Python 2), también puedes simplemente hacer
with open(''output.csv'',''w'',newline='''') as f:
writer=csv.writer(f)
writer.writerow(mystuff)
...
según la documentation .
Más sobre esto en la footnote al footnote del doc:
Si newline = '''' no se especifica, las nuevas líneas incrustadas dentro de los campos entrecomillados no se interpretarán correctamente, y en las plataformas que usan / r / n alineaciones en escribir se agregará un / r / n adicional. Siempre debería ser seguro especificar newline = '''', ya que el módulo csv realiza su propio manejo de línea nueva (universal).
En Windows, siempre abra sus archivos en modo binario ("rb" o "wb") antes de pasarlos a csv.reader o csv.writer.
CSV es realmente un formato binario , con "/ r / n" separando registros. Si ese separador está escrito en modo texto, el tiempo de ejecución de Python reemplaza el "/ n" con "/ r / n", por lo tanto, el "/ r / r / n" que observó en su archivo.
Ver esta respuesta anterior .
Esta respuesta se publicó en 2010 y no aborda el problema en Python3.
Una de las soluciones posibles en Python3, como se describe en la respuesta de @YiboYang, es abrir el archivo con el parámetro de newline
configurado para ser una cadena vacía:
f = open(path_to_file, ''w'', newline='''')
writer = csv.writer(f)
...
...
No estoy seguro exactamente de por qué está sucediendo, pero cambiar su modo de archivo de "w" a "wb" lo soluciona. Ver mi respuesta a " cómo eliminar ^ M " para más detalles.
Puede introducir el parámetro lineterminator = ''/ n'' en el comando csv writer.
import csv
delimiter=''/t''
with open(''tmp.csv'', ''+w'', encoding=''utf-8'') as stream:
writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='''', lineterminator=''/n'')
writer.writerow([''A1'' , ''B1'', ''C1''])
writer.writerow([''A2'' , ''B2'', ''C2''])
writer.writerow([''A3'' , ''B3'', ''C3''])
Si bien @ john-machin da una buena respuesta, no siempre es el mejor enfoque. Por ejemplo, no funciona en Python 3 a menos que codifique todas sus entradas en la grabadora CSV. Además, no soluciona el problema si la secuencia de comandos desea usar sys.stdout como la secuencia.
En su lugar, sugiero configurar el atributo ''lineterminator'' cuando se crea el escritor:
import csv
import sys
doc = csv.writer(sys.stdout, lineterminator=''/n'')
doc.writerow(''abc'')
doc.writerow(range(3))
Ese ejemplo funcionará en Python 2 y Python 3 y no generará los caracteres de nueva línea no deseados. Sin embargo, tenga en cuenta que puede producir líneas nuevas indeseables (omitiendo el carácter LF en los sistemas operativos Unix).
En la mayoría de los casos, sin embargo, creo que el comportamiento es preferible y más natural que tratar todo el CSV como un formato binario. Proporciono esta respuesta como una alternativa para su consideración.
Tenga en cuenta que si usa DictWriter, tendrá una nueva línea desde la función abierta y una nueva línea desde la función writerow. Puede usar newline = '''' dentro de la función abierta para eliminar la nueva línea adicional.
Tienes que agregar el atributo newline = "/ n" para abrir una función como esta:
with open(''file.csv'',''w'',newline="/n") as out:
csv_out = csv.writer(out, delimiter ='';'')