reading - write a new csv file python




Arquivo CSV escrito com Python tem linhas em branco entre cada linha (5)

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?


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.


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!







csv