append new row to old csv file python

600,553

Solution 1

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

Opening a file with the 'a' parameter allows you to append to the end of the file instead of simply overwriting the existing content. Try that.

Solution 2

I prefer this solution using the csv module from the standard library and the with statement to avoid leaving the file open.

The key point is using 'a' for appending when you open the file.

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

If you are using Python 2.7 you may experience superfluous new lines in Windows. You can try to avoid them using 'ab' instead of 'a' this will, however, cause you TypeError: a bytes-like object is required, not 'str' in python and CSV in Python 3.6. Adding the newline='', as Natacha suggests, will cause you a backward incompatibility between Python 2 and 3.

Solution 3

Based in the answer of @G M and paying attention to the @John La Rooy's warning, I was able to append a new row opening the file in 'a'mode.

Even in windows, in order to avoid the newline problem, you must declare it as newline=''.

Now you can open the file in 'a'mode (without the 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'})

I didn't try with the regular writer (without the Dict), but I think that it'll be ok too.

Solution 4

Are you opening the file with mode of 'a' instead of 'w'?

See Reading and Writing Files in the python docs

7.2. Reading and Writing Files

open() returns a file object, and is most commonly used with two arguments: open(filename, mode).

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

The first argument is a string containing the filename. The second argument is another string containing a few characters describing the way in which the file will be used. mode can be 'r' when the file will only be read, 'w' for only writing (an existing file with the same name will be erased), and 'a' opens the file for appending; any data written to the file is automatically added to the end. 'r+' opens the file for both reading and writing. The mode argument is optional; 'r' will be assumed if it’s omitted.

On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a 'b' to the mode, so you can use it platform-independently for all binary files.

Solution 5

If the file exists and contains data, then it is possible to generate the fieldname parameter for csv.DictWriter automatically:

# 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)
Share:
600,553

Related videos on Youtube

laspal
Author by

laspal

Updated on January 18, 2022

Comments

  • laspal
    laspal over 2 years

    I am trying to add a new row to my old csv file. Basically, it gets updated each time I run the Python script.

    Right now I am storing the old csv rows values in a list and then deleting the csv file and creating it again with the new list value.

    Wanted to know are there any better ways of doing this.

  • laspal
    laspal about 14 years
    I tried fp = open(csv_filepathwithname, 'wa') writer = csv.writer(fp) somelist = [ 3,56,3,6,56] writer.writerow((somelist)) but only the last row get append in the file.
  • Areza
    Areza almost 13 years
    may be you could make your answer more elaborated, then it would look like a real answer :-)
  • John La Rooy
    John La Rooy almost 13 years
    @user, I added a link - does that help you?
  • Mr. T
    Mr. T about 6 years
    Please fix your indentation. Answers also benefit from an explanation - and these answers also attract more upvotes.
  • markkaufman
    markkaufman about 6 years
    This is some simple code, it opens the file for append mode, writes out a header rec and then works through the video records in aList.
  • sheth7
    sheth7 over 4 years
    The method assumes that the items being appended are comma separated, which may not always be the case. Then the write method will not maintain the csv delimiter. The answer below is more robust in that sense.
  • Jesse Aldridge
    Jesse Aldridge about 3 years
    Annoying issue that can arise: If the csv file doesn't end with a newline, this will extend the final row instead of adding a new one.
  • Yost777
    Yost777 about 3 years
    This is the better answer to the question, and should be marked as correct answer. The csv package ensures formatting correctly, in fact I can't think of any advantage of using plain text over csv.
  • santma
    santma about 3 years
    Is it possible to loop thru rows and append a new row under each row this way?
  • Benyamin Jafari - aGn
    Benyamin Jafari - aGn about 3 years
    @santma Yes, it is. You can use a for to do that.
  • Eugene Chabanov
    Eugene Chabanov almost 3 years
    For me this code was adding superfluous new lines so I added a newline='' to this row: with open(r'name', 'a', newline='') as f: (windows, python 3.9)