agregar nueva fila al antiguo archivo csv python

208

Estoy tratando de agregar una nueva fila a mi antiguo archivo csv. Básicamente, se actualiza cada vez que ejecuto el script Python.

En este momento estoy almacenando los viejos valores de filas csv en una lista y luego borrando el archivo csv y volviéndolo a crear con el nuevo valor de lista.

Quería saber si hay alguna forma mejor de hacerlo.

laspal
fuente

Respuestas:

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

Abrir un archivo con el 'a'parámetro le permite agregar al final del archivo en lugar de simplemente sobrescribir el contenido existente. Trata eso.

entintado
fuente
2
Intenté fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) pero solo la última fila se agrega en el expediente.
laspal
El método supone que los elementos que se agregan están separados por comas, lo que puede no ser siempre el caso. Entonces el método de escritura no mantendrá el delimitador csv. La respuesta a continuación es más robusta en ese sentido.
sheth7
154

Prefiero esta solución usando el csvmódulo de la biblioteca estándar y la withdeclaración para evitar dejar el archivo abierto.

El punto clave se utiliza 'a'para agregar cuando abre el archivo.

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

Si está utilizando Python 2.7, puede experimentar nuevas líneas superfluas en Windows. Puede intentar evitar que lo usen en 'ab'lugar de 'a'esto, sin embargo, le causará TypeError: se requiere un objeto similar a bytes, no 'str' en python y CSV en Python 3.6. Agregar el newline='', como sugiere Natacha, causará una incompatibilidad hacia atrás entre Python 2 y 3 .

GM
fuente
24

Basado en la respuesta de @GM y prestando atención a la advertencia de @John La Rooy, pude agregar una nueva fila para abrir el archivo en 'a'modo.

Incluso en Windows, para evitar el problema de la nueva línea, debe declararlo como newline=''.

Ahora puede abrir el archivo en 'a'modo (sin 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'})

No intenté con el escritor habitual (sin el Dict), pero creo que también estará bien.

Natacha
fuente
12

¿Estás abriendo el archivo con el modo 'a' en lugar de 'w'?

Ver Leer y escribir archivos en los documentos de Python

7.2. Leer y escribir archivos

open () devuelve un objeto de archivo, y se usa más comúnmente con dos argumentos: open (nombre de archivo, modo).

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

El primer argumento es una cadena que contiene el nombre del archivo. El segundo argumento es otra cadena que contiene algunos caracteres que describen la forma en que se utilizará el archivo. el modo puede ser 'r' cuando el archivo solo se leerá, 'w' solo para escritura (se borrará un archivo existente con el mismo nombre) y 'a' abre el archivo para agregarlo; cualquier dato escrito en el archivo se agrega automáticamente al final. 'r +' abre el archivo para leer y escribir. El argumento de modo es opcional; Se supondrá 'r' si se omite.

En Windows, 'b' agregado al modo abre el archivo en modo binario, por lo que también hay modos como 'rb', 'wb' y 'r + b'. Python en Windows hace una distinción entre archivos de texto y binarios; Los caracteres de fin de línea en los archivos de texto se alteran ligeramente cuando se leen o escriben los datos. Esta modificación detrás de escena de los datos de archivo está bien para los archivos de texto ASCII, pero corromperá datos binarios como ese en archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario al leer y escribir dichos archivos. En Unix, no está de más agregar una 'b' al modo, por lo que puede usarlo independientemente de la plataforma para todos los archivos binarios.

John La Rooy
fuente
es posible que pueda hacer su respuesta más elaborada, entonces parecería una respuesta real :-)
user702846
@usuario, agregué un enlace, ¿eso te ayuda?
John La Rooy
7

Si el archivo existe y contiene datos, entonces es posible generar el fieldnameparámetro csv.DictWriterautomáticamente:

# 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
fuente
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
fuente
1
Por favor arregle su sangría. Las respuestas también se benefician de una explicación, y estas respuestas también atraen más votos a favor.
Sr. T
Este es un código simple, abre el archivo para el modo de agregar, escribe un encabezado de grabación y luego trabaja a través de los registros de video en una Lista.
markkaufman
3

Sigo de esta manera para agregar una nueva línea en un archivo .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
fuente