Neue Zeile an alte CSV-Datei Python anhängen

207

Ich versuche, meiner alten CSV-Datei eine neue Zeile hinzuzufügen. Grundsätzlich wird es jedes Mal aktualisiert, wenn ich das Python-Skript ausführe.

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

Wollte wissen, gibt es bessere Möglichkeiten, dies zu tun.

laspal
quelle

Antworten:

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

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

inkedmn
quelle
2
Ich habe versucht, fp = open (csv_filepathwithname, 'wa') writer = csv.writer (fp) somelist = [3,56,3,6,56] writer.writerow ((somelist)), aber nur die letzte Zeile wird in der angehängt Datei.
Laspal
Bei der Methode wird davon ausgegangen, dass die angehängten Elemente durch Kommas getrennt sind, was möglicherweise nicht immer der Fall ist. Dann behält die Schreibmethode das CSV-Trennzeichen nicht bei. Die Antwort unten ist in diesem Sinne robuster.
Sheth7
152

Ich bevorzuge diese Lösung mit dem csvModul aus der Standardbibliothek und der withAnweisung, um zu vermeiden, dass die Datei offen bleibt.

Der wichtigste Punkt ist das 'a'Anhängen beim Öffnen der Datei.

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

Wenn Sie Python 2.7 verwenden, können in Windows überflüssige neue Zeilen auftreten. Sie können versuchen, zu vermeiden, dass sie 'ab'stattdessen verwendet werden. 'a'Dies führt jedoch zu TypeError: Ein byteähnliches Objekt ist erforderlich, nicht 'str' in Python und CSV in Python 3.6. Das Hinzufügen von newline='', wie Natacha vorschlägt, führt zu einer Abwärtsinkompatibilität zwischen Python 2 und 3 .

GM
quelle
24

Basierend auf der Antwort von @GM und unter Berücksichtigung der Warnung von @John La Rooy konnte ich eine neue Zeile anhängen, in der die Datei im 'a'Modus geöffnet wurde .

Um das Newline-Problem zu vermeiden, müssen Sie es auch in Windows als deklarieren newline=''.

Jetzt können Sie die Datei im 'a'Modus öffnen (ohne das 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'})

Ich habe es nicht mit dem normalen Schriftsteller versucht (ohne das Diktat), aber ich denke, dass es auch in Ordnung sein wird.

Natacha
quelle
12

Ö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 ist eine weitere Zeichenfolge, die einige Zeichen enthält, die die Art und Weise beschreiben, in der die Datei verwendet wird. Der Modus kann "r" sein, wenn die Datei nur gelesen wird, "w" nur zum Schreiben (eine vorhandene Datei mit demselben Namen wird gelöscht) und "a" öffnet die Datei zum Anhängen. Alle in die Datei geschriebenen Daten werden automatisch am Ende hinzugefügt. 'r +' öffnet die Datei zum Lesen und Schreiben. Das Argument mode ist optional. 'r' wird angenommen, wenn es weggelassen wird.

Unter Windows öffnet 'b', das an den Modus angehängt ist, die Datei im Binärmodus, daher gibt es auch Modi wie 'rb', 'wb' und 'r + b'. Python unter Windows unterscheidet zwischen Text- und Binärdateien. Die Zeilenendezeichen in Textdateien werden beim Lesen oder Schreiben von Daten automatisch geringfügig geändert. Diese Änderung der Dateidaten hinter den Kulissen ist für ASCII-Textdateien in Ordnung, beschädigt jedoch Binärdaten wie JPEG- oder EXE-Dateien. Achten Sie beim Lesen und Schreiben solcher Dateien sehr darauf, den Binärmodus zu verwenden. Unter Unix tut es nicht weh, ein 'b' an den Modus anzuhängen, sodass Sie es plattformunabhängig für alle Binärdateien verwenden können.

John La Rooy
quelle
Vielleicht könnten Sie Ihre Antwort ausführlicher machen, dann würde es wie eine echte Antwort aussehen :-)
user702846
@user, ich habe einen Link hinzugefügt - hilft dir das?
John La Rooy
7

Wenn die Datei vorhanden ist und Daten enthält, kann der fieldnameParameter csv.DictWriterautomatisch generiert werden für :

# 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
quelle
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
quelle
1
Bitte korrigieren Sie Ihre Einrückung. Antworten profitieren auch von einer Erklärung - und diese Antworten ziehen auch mehr positive Stimmen an.
Mr. T
Dies ist ein einfacher Code, der die Datei für den Append-Modus öffnet, einen Header-Rec schreibt und dann die Videoaufzeichnungen in aList durcharbeitet.
Markkaufman
2

Auf diese Weise füge ich eine neue Zeile in eine CSV-Datei ein:

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
quelle