it-swarm.com.de

neue Zeile an alte CSV-Datei Python anhängen

Ich versuche, meiner alten CSV-Datei eine neue Zeile hinzuzufügen. Grundsätzlich wird es bei jedem Ausführen des Python-Skripts aktualisiert. 

Im Moment speichere ich die alten CSV-Zeilenwerte in einer Liste und lösche dann die CSV-Datei und erstelle sie mit dem neuen Listenwert neu.

Ich wollte wissen, gibt es keine besseren Möglichkeiten, dies zu tun.

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

Wenn Sie eine Datei mit dem Parameter 'a' öffnen, können Sie das Ende der Datei anhängen, anstatt den vorhandenen Inhalt einfach zu überschreiben. Versuch das.

179
inkedmn

Ich bevorzuge diese Lösung mit dem Modul csv aus der Standardbibliothek und der Anweisung with , um zu vermeiden, dass die Datei geöffnet bleibt.

Der Schlüsselpunkt ist 'a' zum Anhängen, wenn Sie die Datei öffnen.

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

In Windows treten möglicherweise überflüssige neue Zeilen auf. Sie können versuchen, sie mithilfe von 'ab' anstelle von 'a' zu vermeiden.

103
G M

Öffnen Sie die Datei mit dem Modus 'a' anstelle von 'w'?

Siehe Lesen und Schreiben von Dateien in den Python-Dokumenten

7.2. Dateien lesen und schreiben

open () gibt ein Dateiobjekt zurück und wird am häufigsten mit zwei Argumenten verwendet: open (Dateiname, Modus).

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

Das erste Argument ist eine Zeichenfolge, die den Dateinamen enthält. Das zweite Argument lautet eine andere Zeichenfolge, die einige Zeichen enthält, die beschreiben, auf welche Weise Die Datei wird verwendet. Der Modus kann 'r' sein, wenn die Datei nur .__ ist. read, 'w' nur zum Schreiben (eine vorhandene Datei mit demselben Namen wird gelöscht), und 'a' öffnet die Datei zum Anhängen; alle Daten, die in .__ geschrieben wurden. Die Datei wird automatisch am Ende hinzugefügt. 'r +' öffnet die Datei für sowohl lesen als auch schreiben. Das Modusargument ist optional. 'r' wird .__ sein. angenommen, wenn es weggelassen wird.

Unter Windows wird "b" an den Modus angehängt, um die Datei im Binärmodus zu öffnen, also Es gibt auch Modi wie 'rb', 'wb' und 'r + b'. Python unter Windows unterscheidet zwischen Text- und Binärdateien; das Zeilenende Zeichen in Textdateien werden automatisch geändert, wenn data wird gelesen oder geschrieben. Diese Änderung hinter den Kulissen der Dateidaten ist für ASCII - Textdateien in Ordnung, jedoch werden binäre Daten wie diese beschädigt in JPEG- oder EXE-Dateien. Achten Sie beim Lesen von .__ darauf, den binären Modus zu verwenden. und Schreiben solcher Dateien. Unter Unix schadet es nicht, ein. B an .__ anzuhängen. den Modus, so dass Sie es plattformunabhängig für alle Binärdateien verwenden können Dateien.

12
John La Rooy

Basierend auf der Antwort von @G M und der Warnung von @John La Rooy konnte ich eine neue Zeile anhängen, die die Datei im 'a'mode öffnet.

Selbst unter Windows müssen Sie, um das Problem der Zeilenumbrüche zu vermeiden, den Code newline='' angeben.

Jetzt können Sie die Datei in 'a'mode (ohne das b) öffnen.

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'})

Ich habe es nicht mit dem regulären Autor versucht (ohne Dict), aber ich denke, dass es auch in Ordnung sein wird.

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

Wenn die Datei existiert und Daten enthält, ist es möglich, den Parameter fieldname für csv.DictWriter automatisch zu generieren:

# 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

Ich gehe folgendermaßen vor, um eine neue Zeile in einer CSV-Datei anzufügen:

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