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()
Ele gera um arquivo, test.csv
com um extra \r
a cada linha, da seguinte forma:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
em vez do esperado:
hi,dude\r\nhi2,dude2\r\n
Por que isso está acontecendo ou esse é realmente o comportamento desejado?
Nota:
- Esse comportamento pode ocorrer com o Python 2 ou 3.
Respostas:
Python 3:
newline=''
newline='\n'
Python 2:
No Windows, abra sempre seus arquivos no modo binário (
"rb"
ou"wb"
) antes de passá-los paracsv.reader
oucsv.writer
.Embora o arquivo seja um arquivo de texto, o CSV é considerado um formato binário pelas bibliotecas envolvidas, com a
\r\n
separação de registros. Se esse separador for gravado no modo de texto, o tempo de execução do Python substituirá o\n
com\r\n
, daí o\r\r\n
observado no arquivo.Veja esta resposta anterior .
fonte
open(..., "w", newline="\n", encoding="utf-8")
.newline
também pode ser uma sequência em branco, o mesmo resultado."wb"
não funciona no Python 3, as strings e a interface do buffer são incompatíveis.writer = csv.writer(f, lineterminator='\n')
Enquanto @ john-machin dá uma boa resposta, nem sempre é a melhor abordagem. Por exemplo, ele não funciona no Python 3, a menos que você codifique todas as suas entradas no gravador de CSV. Além disso, ele não soluciona o problema se o script quiser usar o sys.stdout como o fluxo.
Em vez disso, sugiro definir o atributo 'lineterminator' ao criar o gravador:
Esse exemplo funcionará no Python 2 e Python 3 e não produzirá os caracteres de nova linha indesejados. Observe, no entanto, que ele pode produzir novas linhas indesejáveis (omitindo o caractere LF nos sistemas operacionais Unix).
Na maioria dos casos, porém, acredito que o comportamento é preferível e mais natural do que tratar todo o CSV como um formato binário. Eu forneço esta resposta como uma alternativa para sua consideração.
fonte
\r
não é mais escapado! Parece que isso está ocorrendocsvwriter
, mas, como está, a saída de CSV não conforme significa que esse não é o caminho a seguir.^M
problema para mim, enquanto as 2 sugestões da resposta aceita não funcionaram.No Python 3 (eu não tentei isso no Python 2), você também pode simplesmente fazer
conforme documentação .
Mais sobre isso na nota de rodapé do documento :
fonte
Você pode introduzir o parâmetro lineterminator = '\ n' no comando csv writer.
fonte
lineterminator='\n'
); o módulo CSV parecia ser a origem de\r\n
. Nenhum conjunto de argumentosopen
teve qualquer efeito.Não sei exatamente por que isso está acontecendo, mas alterar o modo de arquivo de "w" para "wb" o corrige. Veja minha resposta para " como remover ^ M " para mais detalhes.
fonte
Você precisa adicionar o atributo newline = "\ n" para abrir uma função como esta:
fonte
Observe que, se você usar o DictWriter, terá uma nova linha da função aberta e uma nova linha da função de gravação. Você pode usar newline = '' na função aberta para remover a nova linha extra.
fonte