web-dev-qa-db-fra.com

ajouter une nouvelle ligne à l'ancien fichier csv python

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 crée à nouveau avec la nouvelle valeur de liste.

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

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

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

179
inkedmn

Je préfère cette solution utilisant le module csv de la bibliothèque standard et l'instruction with pour éviter de laisser le fichier ouvert.

Le point clé est d'utiliser '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)

Vous pouvez rencontrer de nouvelles lignes superflues dans Windows. Vous pouvez essayer de les éviter en utilisant 'ab' au lieu de 'a'.

103
G M

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 () retourne un objet fichier et est le plus souvent utilisé avec deux arguments: open (nom du 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 du 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' quand le fichier ne sera plus que read, 'w' pour l'écriture seule (un fichier existant portant le même nom sera effacé ), et 'a' ouvre le fichier pour l'ajouter; toutes les données écrites dans le fichier est automatiquement ajouté à la fin. 'r +' ouvre le fichier pour à la fois lire et écrire. L'argument mode est optionnel. 'r' sera supposé s'il est omis.

Sous Windows, "b" ajouté au mode ouvre le fichier en mode binaire, donc il existe également des modes tels que 'rb', 'wb' et 'r + b'. Python sous Windows fait une distinction entre les fichiers texte et les fichiers binaires; la fin de ligne les caractères des fichiers texte sont automatiquement légèrement modifiés lorsque data est lu ou écrit. Cette modification en arrière-plan des données de fichier convient pour les fichiers texte ASCII, mais les données binaires corrompues seront corrompues. en fichiers JPEG ou EXE. Faites très attention à utiliser le mode binaire lors de la lecture et écrire de tels fichiers. Sous Unix, ajouter un 'b' à .__ ne fait pas de mal. le mode, de sorte que vous pouvez l'utiliser indépendamment de la plate-forme pour tout binaire des dossiers.

12
John La Rooy

Sur la base de la réponse de @G M et en prêtant attention à l'avertissement de @John La Rooy, j'ai pu ajouter une nouvelle ligne ouvrant le fichier en 'a'mode.

Même dans Windows, pour éviter le problème de nouvelle ligne, vous devez le déclarer en tant que 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 régulier (sans le dict), mais je pense que ça ira aussi.

9
Natacha
# 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) 
3
markkaufman

Si le fichier existe et contient des données, il est possible de générer automatiquement le paramètre fieldname 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)
1
Ron Kalian

Je fais avec cette manière 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")
0
Benyamin Jafari