aggiunge una nuova riga al vecchio file pson csv


208

Sto cercando di aggiungere una nuova riga al mio vecchio file CSV. Fondamentalmente, viene aggiornato ogni volta che eseguo lo script Python.

In questo momento sto memorizzando i vecchi valori delle righe CSV in un elenco e quindi eliminando il file CSV e creando nuovamente con il nuovo valore elenco.

Volevo sapere che ci sono modi migliori per farlo.

Risposte:


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

L'apertura di un file con il 'a'parametro consente di aggiungere alla fine del file anziché semplicemente sovrascrivere il contenuto esistente. Prova questo.


2
Ho provato fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) ma solo l'ultima riga viene aggiunta in file.
Laspal

Il metodo presuppone che gli elementi aggiunti siano separati da virgola, il che potrebbe non essere sempre il caso. Quindi il metodo di scrittura non manterrà il delimitatore CSV. La risposta sotto è più robusta in questo senso.
sheth7

154

Preferisco questa soluzione usando il csvmodulo della libreria standard e l' withistruzione per evitare di lasciare il file aperto.

Il punto chiave sta usando 'a'per aggiungere quando si apre il file.

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

Se stai usando Python 2.7 potresti riscontrare nuove righe superflue in Windows. Puoi provare a evitarli usando'ab' invece di 'a'questo, ma causerai TypeError: è richiesto un oggetto simile a byte, non 'str' in Python e CSV in Python 3.6. L'aggiunta di newline='', come suggerisce Natacha, causerà un'incompatibilità all'indietro tra Python 2 e 3 .


24

Basandomi sulla risposta di @GM e prestando attenzione all'avvertimento di @John La Rooy, sono stato in grado di aggiungere una nuova riga aprendo il file in 'a'modalità.

Anche in Windows, al fine di evitare il problema della nuova riga, è necessario dichiararlo come newline='' .

Ora puoi aprire il file in 'a'modalità (senza la 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'})

Non ho provato con lo scrittore normale (senza il Dict), ma penso che andrà anche bene.


12

Stai aprendo il file con la modalità 'a' invece di 'w'?

Vedere Lettura e scrittura di file nei documenti di Python

7.2. Lettura e scrittura di file

open () restituisce un oggetto file e viene comunemente utilizzato con due argomenti: open (nome file, modalità).

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

Il primo argomento è una stringa contenente il nome file. Il secondo argomento è un'altra stringa contenente alcuni caratteri che descrivono il modo in cui verrà utilizzato il file. mode può essere 'r' quando il file verrà letto solo, 'w' solo per la scrittura (un file esistente con lo stesso nome verrà cancellato) e 'a' apre il file per l'aggiunta; tutti i dati scritti nel file vengono aggiunti automaticamente alla fine. 'r +' apre il file sia in lettura che in scrittura. L'argomento mode è facoltativo; 'r' verrà assunto se omesso.

Su Windows, "b" aggiunto alla modalità apre il file in modalità binaria, quindi esistono anche modalità come "rb", "wb" e "r + b". Python su Windows fa una distinzione tra file di testo e file binari; i caratteri di fine riga nei file di testo vengono automaticamente modificati leggermente quando i dati vengono letti o scritti. Questa modifica dietro le quinte dei dati dei file va bene per i file di testo ASCII, ma corromperà i dati binari come quelli nei file JPEG o EXE. Prestare molta attenzione all'utilizzo della modalità binaria durante la lettura e la scrittura di tali file. Su Unix, non fa male aggiungere una "b" alla modalità, quindi puoi usarla in modo indipendente dalla piattaforma per tutti i file binari.


forse potresti rendere la tua risposta più elaborata, quindi sembrerebbe una vera risposta :-)
user702846

@utente, ho aggiunto un link: ti aiuta?
John La Rooy,

7

Se il file esiste e contiene dati, è possibile generare automaticamente il fieldnameparametro per csv.DictWriter:

# 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)

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) 

1
Correggi il rientro. Anche le risposte traggono vantaggio da una spiegazione e queste risposte attirano anche più voti.
Sig. T

Questo è un semplice codice, apre il file per la modalità append, scrive un'intestazione rec e quindi lavora attraverso i record video in aList.
Markkaufman,

3

Seguo questo modo per aggiungere una nuova riga in un file .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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.