ajouter une nouvelle ligne à l'ancien fichier csv python

209

J'essaie d'ajouter une nouvelle ligne à mon ancien fichier csv. Fondamentalement, il est mis à jour chaque fois que j'exécute le script Python.

En ce moment, je stocke les anciennes valeurs de lignes csv dans une liste, puis je supprime le fichier csv et le recrée avec la nouvelle valeur de liste.

Je voulais savoir s'il y avait de meilleures façons de le faire.

laspal
la source

Réponses:

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

L'ouverture d'un fichier avec le 'a'paramètre vous permet d'ajouter à la fin du fichier au lieu de simplement écraser le contenu existant. Essayez ça.

inkedmn
la source
2
J'ai essayé fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)) mais seule la dernière ligne est ajoutée dans le fichier.
laspal
La méthode suppose que les éléments ajoutés sont séparés par des virgules, ce qui n'est pas toujours le cas. Ensuite, la méthode d'écriture ne conservera pas le délimiteur csv. La réponse ci-dessous est plus robuste dans ce sens.
sheth7
154

Je préfère cette solution en utilisant le csvmodule de la bibliothèque standard et l' withinstruction pour éviter de laisser le fichier ouvert.

Le point clé utilise 'a'pour l'ajout lorsque vous ouvrez le fichier.

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

Si vous utilisez Python 2.7, vous pouvez rencontrer de nouvelles lignes superflues dans Windows. Vous pouvez essayer de les éviter d'utiliser 'ab'au lieu de 'a'cela, cependant, vous causera TypeError: un objet de type octets est requis, pas 'str' en python et CSV en Python 3.6. L'ajout de newline='', comme le suggère Natacha, vous causera une incompatibilité vers l'arrière entre Python 2 et 3 .

GM
la source
24

Basé sur la réponse de @GM et en faisant attention à l'avertissement de @John La Rooy, j'ai pu ajouter une nouvelle ligne ouvrant le fichier en 'a'mode.

Même sous Windows, pour éviter le problème de nouvelle ligne, vous devez le déclarer comme newline=''.

Vous pouvez maintenant ouvrir le fichier en 'a'mode (sans le 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'})

Je n'ai pas essayé avec l'écrivain habituel (sans le Dict), mais je pense que ça ira aussi.

Natacha
la source
12

Ouvrez-vous le fichier avec le mode «a» au lieu de «w»?

Voir Lecture et écriture de fichiers dans les documents python

7.2. Lecture et écriture de fichiers

open () renvoie un objet fichier et est le plus souvent utilisé avec deux arguments: open (nom de fichier, mode).

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

Le premier argument est une chaîne contenant le nom de fichier. Le deuxième argument est une autre chaîne contenant quelques caractères décrivant la manière dont le fichier sera utilisé. le mode peut être «r» lorsque le fichier sera lu uniquement, «w» pour l'écriture uniquement (un fichier existant du même nom sera effacé) et «a» ouvrira le fichier pour l'ajout; toutes les données écrites dans le fichier sont automatiquement ajoutées à la fin. 'r +' ouvre le fichier en lecture et en écriture. L'argument mode est facultatif; 'r' sera supposé s'il est omis.

Sous Windows, «b» ajouté au mode ouvre le fichier en mode binaire, il existe donc également des modes comme «rb», «wb» et «r + b». Python sur Windows fait une distinction entre les fichiers texte et binaires; les caractères de fin de ligne des fichiers texte sont automatiquement légèrement modifiés lors de la lecture ou de l'écriture des données. Cette modification en arrière-plan des données de fichier convient aux fichiers texte ASCII, mais elle corrompra les données binaires comme celles des fichiers JPEG ou EXE. Faites très attention à utiliser le mode binaire lors de la lecture et de l'écriture de tels fichiers. Sous Unix, il n'est pas inutile d'ajouter un «b» au mode, vous pouvez donc l'utiliser indépendamment de la plate-forme pour tous les fichiers binaires.

John La Rooy
la source
vous pourriez peut-être rendre votre réponse plus élaborée, alors cela ressemblerait à une vraie réponse :-)
user702846
@user, j'ai ajouté un lien - cela vous aide-t-il?
John La Rooy
7

Si le fichier existe et contient des données, il est possible de générer automatiquement le fieldnameparamètre pour 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)
Ron Kalian
la source
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
la source
1
Veuillez corriger votre indentation. Les réponses bénéficient également d'une explication - et ces réponses attirent également plus de votes positifs.
M. T
Il s'agit d'un code simple, il ouvre le fichier pour le mode d'ajout, écrit un enregistrement d'en-tête et fonctionne ensuite à travers les enregistrements vidéo dans aList.
markkaufman
3

Je poursuis de cette façon pour ajouter une nouvelle ligne dans un fichier .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
la source