reading - write a new csv file python
Arquivo CSV escrito com Python tem linhas em branco entre cada linha (5)
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 término 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á \n
por \r\n
(o terminador de linha padrão do Windows) resultando em \r\r\n
.
lineterminator
com o lineterminator
não é a solução.
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ê o thefile.csv
, faz alterações e grava os resultados em thefile_subset1
.
No entanto, quando eu abro o csv resultante no Microsoft Excel, há uma linha extra em branco após cada registro!
Existe uma maneira de não colocar uma linha extra em branco?
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 substituir a nova linha como vazia. Igual a:
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
Eu estou escrevendo esta resposta para python 3, como eu comecei inicialmente o mesmo problema.
Eu deveria obter dados do arduino usando PySerial
e gravá-los em um arquivo .csv. Cada leitura no meu caso terminou com '\r\n'
, então a nova linha estava sempre separando cada linha.
No meu caso, newline=''
opção newline=''
não funcionou. Porque mostrou algum erro como:
with open('op.csv', 'a',newline=' ') as csv_file:
ValueError: illegal newline value: ''
Então, parece que eles não aceitam a omissão de nova linha aqui.
Vendo uma das respostas aqui apenas, eu 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.
No Python 2, abra o outfile
com o modo 'wb'
vez de 'w'
. O csv.writer
escreve \r\n
no arquivo diretamente. Se você não abrir o arquivo no modo binário , ele irá gravar \r\r\n
porque no modo texto do Windows irá traduzir cada \n
em \r\n
.
No Python 3, a sintaxe requerida mudou, então abra o outfile
com o parâmetro adicional newline=''
.
Exemplos:
# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
writer = csv.writer(outfile)
# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
Links de Documentação
Use o método definido abaixo para gravar dados no arquivo CSV.
open('outputFile.csv', 'a',newline='')
Basta adicionar um parâmetro newline=''
dentro do método open
:
def writePhoneSpecsToCSV():
rowData=["field1", "field2"]
with open('outputFile.csv', 'a',newline='') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(rowData)
Isso irá gravar linhas CSV sem criar linhas adicionais!