anexar nova linha ao arquivo csv antigo python

208

Estou tentando adicionar uma nova linha ao meu arquivo csv antigo. Basicamente, ele é atualizado sempre que executo o script Python.

No momento, estou armazenando os valores antigos das linhas csv em uma lista e excluindo o arquivo csv e criando-o novamente com o novo valor da lista.

Queria saber se existem maneiras melhores de fazer isso.

laspal
fonte

Respostas:

247
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

Abrir um arquivo com o 'a'parâmetro permite anexar ao final do arquivo em vez de simplesmente substituir o conteúdo existente. Tente isso.

inkedmn
fonte
2
Eu tentei fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)), mas apenas a última linha é anexada no Arquivo.
laspal
O método pressupõe que os itens anexados sejam separados por vírgula, o que nem sempre pode ser o caso. Em seguida, o método de gravação não manterá o delimitador csv. A resposta abaixo é mais robusta nesse sentido.
sheth7 30/01
153

Prefiro esta solução usando o csvmódulo da biblioteca padrão e a withinstrução para evitar deixar o arquivo aberto.

O ponto principal está sendo usado 'a'para anexar quando você abre o arquivo.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

Se você estiver usando o Python 2.7, poderá enfrentar novas linhas supérfluas no Windows. Você pode tentar evitá-los usando em 'ab'vez 'a'disso, no entanto, causará TypeError: um objeto semelhante a bytes é necessário, não 'str' em python e CSV no Python 3.6. Adicionar o newline='', como sugere Natacha, causará uma incompatibilidade com versões anteriores entre o Python 2 e 3 .

GM
fonte
24

Com base na resposta da @GM e prestando atenção ao aviso do @John La Rooy, pude acrescentar uma nova linha abrindo o arquivo no 'a'modo.

Mesmo no Windows, para evitar o problema da nova linha, você deve declará-lo como newline=''.

Agora você pode abrir o arquivo no 'a'modo (sem o b).

import csv

with open(r'names.csv', 'a', newline='') as csvfile:
    fieldnames = ['This','aNew']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writerow({'This':'is', 'aNew':'Row'})

Eu não tentei com o escritor regular (sem o Dict), mas acho que tudo ficará bem também.

Natacha
fonte
12

Você está abrindo o arquivo com o modo 'a' em vez de 'w'?

Consulte Leitura e gravação de arquivos nos documentos python

7.2 Lendo e gravando arquivos

open () retorna um objeto de arquivo e é mais comumente usado com dois argumentos: open (nome do arquivo, modo).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

O primeiro argumento é uma sequência que contém o nome do arquivo. O segundo argumento é outra sequência que contém alguns caracteres que descrevem a maneira como o arquivo será usado. o modo pode ser 'r' quando o arquivo será lido apenas, 'w' apenas para gravação (um arquivo existente com o mesmo nome será apagado) e 'a' abrirá o arquivo para anexar; todos os dados gravados no arquivo são adicionados automaticamente ao final. 'r +' abre o arquivo para leitura e gravação. O argumento mode é opcional; 'r' será assumido se for omitido.

No Windows, 'b' anexado ao modo abre o arquivo no modo binário; também existem modos como 'rb', 'wb' e 'r + b'. O Python no Windows faz uma distinção entre arquivos de texto e binários; os caracteres de fim de linha nos arquivos de texto são automaticamente ligeiramente alterados quando os dados são lidos ou gravados. Essa modificação nos bastidores dos dados dos arquivos é boa para arquivos de texto ASCII, mas corrompe dados binários como os dos arquivos JPEG ou EXE. Tenha muito cuidado ao usar o modo binário ao ler e gravar esses arquivos. No Unix, não custa anexar um 'b' ao modo, para que você possa usá-lo independentemente da plataforma para todos os arquivos binários.

John La Rooy
fonte
pode ser que você poderia fazer a sua resposta mais elaborada, em seguida, que seria parecido com uma resposta real :-)
user702846
@user, adicionei um link - isso ajuda você?
John La Rooy 29/07
7

Se o arquivo existir e contiver dados, é possível gerar o fieldnameparâmetro csv.DictWriterautomaticamente:

# read header automatically
with open(myFile, "r") as f:
    reader = csv.reader(f)
    for header in reader:
        break

# add row to CSV file
with open(myFile, "a", newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writerow(myDict)
Ron Kalian
fonte
6
# I like using the codecs opening in a with 
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
    logger = csv.DictWriter(logfile, fieldnames=field_names)
    logger.writeheader()

# some more code stuff 

    for video in aList:
        video_result = {}                                     
        video_result['date'] = video['snippet']['publishedAt']
        video_result['user'] = video['id']
        video_result['text'] = video['snippet']['description'].encode('utf8')
        logger.writerow(video_result) 
markkaufman
fonte
1
Corrija seu recuo. As respostas também se beneficiam de uma explicação - e essas respostas também atraem mais votos.
Mr. T
Este é um código simples, abre o arquivo no modo de acréscimo, grava um cabeçalho e depois trabalha nos registros de vídeo em aList.
21318 Markkaufman
2

Eu faço dessa maneira para acrescentar uma nova linha em um arquivo .csv:

pose_x = 1 
pose_y = 2

with open('path-to-your-csv-file.csv', mode='a') as file_:
    file_.write("{},{}".format(pose_x, pose_y))
    file_.write("\n")
Benyamin Jafari
fonte