Hướng dẫn python append to csv

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.

I wanted to know are there any better ways of doing this.

Gino Mempin

20.8k24 gold badges84 silver badges111 bronze badges

asked Mar 2, 2010 at 14:23

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.

davidism

113k24 gold badges367 silver badges323 bronze badges

answered Mar 2, 2010 at 14:25

brettkellybrettkelly

27.1k8 gold badges53 silver badges70 bronze badges

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.

answered Jun 6, 2016 at 9:46

G MG M

18.7k10 gold badges76 silver badges79 bronze badges

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.

answered Jun 21, 2018 at 16:47

NatachaNatacha

1,04716 silver badges20 bronze badges

0

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 

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.

answered Mar 2, 2010 at 14:26

John La RooyJohn La Rooy

286k51 gold badges358 silver badges498 bronze badges

2

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]

answered Feb 6, 2019 at 11:52

Ron KalianRon Kalian

2,9742 gold badges14 silver badges22 bronze badges

If you use pandas, you can append your dataframes to an existing CSV file this way:

df.to_csv['log.csv', mode='a', index=False, header=False]

With mode='a' we ensure that we append, rather than overwrite, and with header=False we ensure that we append only the values of df rows, rather than header + values.

answered Oct 13, 2020 at 14:21

Anna GellerAnna Geller

1,1026 silver badges6 bronze badges

I use the following approach to append a new line in a .csv file:

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"]  # Next line.

[NOTE]:

  • mode='a' is append mode.

answered Jul 18, 2019 at 18:37

Benyamin JafariBenyamin Jafari

23.5k20 gold badges113 silver badges134 bronze badges

2

# 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] 

Georgy

10.8k7 gold badges62 silver badges68 bronze badges

answered Mar 15, 2018 at 20:57

2

Chủ Đề