import csv
with open('thefile.csv', 'rb') as f:
data = list(csv.reader(f))
import collections
counter = collections.defaultdict(int)
for row in data:
counter[row[10]] += 1
with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
writer = csv.writer(outfile)
for row in data:
if counter[row[10]] >= 504:
writer.writerow(row)
Este código lê thefile.csv
, faz alterações e grava resultados em thefile_subset1
.
No entanto, quando abro o csv resultante no Microsoft Excel, há uma linha em branco extra após cada registro!
Existe uma maneira de fazê-lo não colocar uma linha em branco extra?
Respostas:
No Python 2, abra
outfile
com mode em'wb'
vez de'w'
. Ascsv.writer
gravações\r\n
no arquivo diretamente. Se você não abrir o arquivo no modo binário , ele gravará,\r\r\n
porque no modo de texto do Windows converterá cada\n
em\r\n
.No Python 3, a sintaxe necessária foi alterada (consulte os links de documentação abaixo), então abra
outfile
com o parâmetro adicionalnewline=''
(string vazia).Exemplos:
Links de documentação
fonte
io.open
com onewlines
argumento Se você ainda está escrevendo no 2.x, parece uma escolha melhor, pois é compatível com a frente.io.open
. Existe umunicodecsv
módulo de terceiros para o Python 2.7 que funciona melhor.newline=''
truque não funciona em python3 com StringIO ou TemporaryFile?StringIO
armazena em buffer os mesmos pontos de código que seriam codificados em um arquivo eTemporaryFile
suporta onewline
parâmetro, para que possa ser aberto como emopen
. Faça uma pergunta com um programa de amostra que não está funcionando.Abrir o arquivo no modo binário "wb" não funcionará no Python 3+. Ou melhor, você teria que converter seus dados em binários antes de escrevê-los. Isso é apenas um aborrecimento.
Em vez disso, você deve mantê-lo no modo de texto, mas substitua a nova linha como vazia. Igual a:
fonte
A resposta simples é que os arquivos csv sempre devem ser abertos no modo binário, seja para entrada ou saída, caso contrário, no Windows, há problemas com o final da linha. Especificamente na saída, o módulo csv gravará
\r\n
(o terminador de linha CSV padrão) e, em seguida (no modo de texto), o tempo de execução substituirá o\n
by\r\n
(o terminador de linha padrão do Windows), resultando em\r\r\n
.Brincar com o
lineterminator
NÃO é a solução.fonte
Nota: Parece que essa não é a solução preferida devido ao modo como a linha extra foi adicionada em um sistema Windows. Conforme declarado no documento python :
O Windows é uma dessas plataformas em que isso faz a diferença. Embora a alteração do terminador de linha, como descrito abaixo, possa ter corrigido o problema, o problema pode ser evitado ao abrir o arquivo no modo binário. Pode-se dizer que esta solução é mais "elegente". "Brincar" com o terminador de linha provavelmente resultaria em código não transportável entre sistemas nesse caso, onde abrir um arquivo no modo binário em um sistema unix não resulta em nenhum efeito. ie resulta em código compatível entre sistemas.
Do Python Docs :
Original :
Como parte dos paramaters opcionais para o csv.writer, se você estiver recebendo linhas em branco extras, talvez seja necessário alterar o determinador de linha (informações aqui ). Exemplo abaixo adaptado da página python csv docs. Altere de '\ n' para o que for. Como isso é apenas uma facada no escuro, isso pode ou não funcionar, mas é o meu melhor palpite.
fonte
Estou escrevendo esta resposta por escrito para python 3, pois inicialmente eu tenho o mesmo problema.
Eu deveria obter dados do arduino usando
PySerial
e gravá-los em um arquivo .csv. Cada leitura no meu caso terminava com'\r\n'
, então a nova linha estava sempre separando cada linha.No meu caso, a
newline=''
opção não funcionou. Porque mostrou algum erro como:Portanto, parecia que eles não aceitam a omissão de nova linha aqui.
Vendo apenas uma das respostas aqui, mencionei o terminador de linha no objeto escritor, como,
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
e isso funcionou para mim por pular as novas linhas extras.
fonte
with open('my_file.csv', 'a',newline='') as csvfile:
funciona absolutamente bem. O problema com a sua resposta é que aqui você está escrevendo' '
em vez de''
O "lineterminator = '\ r'" permite passar para a próxima linha, sem linha vazia entre duas.
fonte
Tomando emprestado desta resposta , parece que a solução mais limpa é usar
io.TextIOWrapper
. Consegui resolver esse problema para mim da seguinte maneira:A resposta acima não é compatível com o Python 2. Para ter compatibilidade, suponho que seria necessário agrupar toda a lógica de escrita em um
if
bloco:fonte
Use o método definido abaixo para gravar dados no arquivo CSV.
Basta adicionar um
newline=''
parâmetro adicional dentro doopen
método:Isso gravará linhas CSV sem criar linhas adicionais!
fonte
Ao usar o Python 3, as linhas vazias podem ser evitadas usando o módulo codecs . Conforme declarado na documentação, os arquivos são abertos no modo binário, portanto, nenhuma alteração no newwar kwarg é necessária. Eu estava enfrentando o mesmo problema recentemente e isso funcionou para mim:
fonte