How to write to a CSV line by line?

418,983

Solution 1

General way:

##text=List of strings to be written to file
with open('csvfile.csv','wb') as file:
    for line in text:
        file.write(line)
        file.write('\n')

OR

Using CSV writer :

import csv
with open(<path to output_csv>, "wb") as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for line in data:
            writer.writerow(line)

OR

Simplest way:

f = open('csvfile.csv','w')
f.write('hi there\n') #Give your csv text here.
## Python will convert \n to os.linesep
f.close()

Solution 2

You could just write to the file as you would write any normal file.

with open('csvfile.csv','wb') as file:
    for l in text:
        file.write(l)
        file.write('\n')

If just in case, it is a list of lists, you could directly use built-in csv module

import csv

with open("csvfile.csv", "wb") as file:
    writer = csv.writer(file)
    writer.writerows(text)

Solution 3

I would simply write each line to a file, since it's already in a CSV format:

write_file = "output.csv"
with open(write_file, "wt", encoding="utf-8") as output:
    for line in text:
        output.write(line + '\n')

I can't recall how to write lines with line-breaks at the moment, though :p

Also, you might like to take a look at this answer about write(), writelines(), and '\n'.

Solution 4

To complement the previous answers, I whipped up a quick class to write to CSV files. It makes it easier to manage and close open files and achieve consistency and cleaner code if you have to deal with multiple files.

class CSVWriter():

    filename = None
    fp = None
    writer = None

    def __init__(self, filename):
        self.filename = filename
        self.fp = open(self.filename, 'w', encoding='utf8')
        self.writer = csv.writer(self.fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL, lineterminator='\n')

    def close(self):
        self.fp.close()

    def write(self, elems):
        self.writer.writerow(elems)

    def size(self):
        return os.path.getsize(self.filename)

    def fname(self):
        return self.filename

Example usage:

mycsv = CSVWriter('/tmp/test.csv')
mycsv.write((12,'green','apples'))
mycsv.write((7,'yellow','bananas'))
mycsv.close()
print("Written %d bytes to %s" % (mycsv.size(), mycsv.fname()))

Have fun

Solution 5

What about this:

with open("your_csv_file.csv", "w") as f:
    f.write("\n".join(text))

str.join() Return a string which is the concatenation of the strings in iterable. The separator between elements is the string providing this method.

Share:
418,983
Mustard Tiger
Author by

Mustard Tiger

Updated on October 05, 2021

Comments

  • Mustard Tiger
    Mustard Tiger over 2 years

    I have data which is being accessed via http request and is sent back by the server in a comma separated format, I have the following code :

    site= 'www.example.com'
    hdr = {'User-Agent': 'Mozilla/5.0'}
    req = urllib2.Request(site,headers=hdr)
    page = urllib2.urlopen(req)
    soup = BeautifulSoup(page)
    soup = soup.get_text()
    text=str(soup)
    

    The content of text is as follows:

    april,2,5,7
    may,3,5,8
    june,4,7,3
    july,5,6,9
    

    How can I save this data into a CSV file. I know I can do something along the lines of the following to iterate line by line:

    import StringIO
    s = StringIO.StringIO(text)
    for line in s:
    

    But i'm unsure how to now properly write each line to CSV

    EDIT---> Thanks for the feedback as suggested the solution was rather simple and can be seen below.

    Solution:

    import StringIO
    s = StringIO.StringIO(text)
    with open('fileName.csv', 'w') as f:
        for line in s:
            f.write(line)
    
  • Khaled Hamed
    Khaled Hamed almost 6 years
    for python 3, change it to with open(<path to output_csv>, "w", newline='') as csv_file:
  • Francisco Maria Calisto
    Francisco Maria Calisto over 5 years
    Missing information on this line for line in data:. Please fix that. Thank you.
  • Ani Menon
    Ani Menon over 5 years
    @gsamaras The idea was to help the community, unlike you edit and comment which are useless.
  • Jürgen K.
    Jürgen K. over 4 years
    how to append a line, if there is already something in the csv-file, using the third solution?
  • Ani Menon
    Ani Menon over 4 years
    @JürgenK. Use 'a'(append mode) in place of 'w'(write mode).
  • tsveti_iko
    tsveti_iko over 3 years
    If you're getting the error: TypeError: a bytes-like object is required, not 'str', just change the 'wb' to 'w' in the open() function.
  • Bellash
    Bellash over 2 years
    also care about encoding like this open(write_file, 'wt', encoding='utf-8')