How to convert a list to a csv in python
will do it, but that’s not really csv (would need escaping and such).
You can convert almost any list to csv using pandas like this:
import pandas as pd list1 = [1,2,3,4,5] df = pd.DataFrame(list1)
Depending on what you want to do with this csv, you can either keep the csv in a variable:
csv_data = df.to_csv(index=False)
Or save it in your filesystem like this:
df.to_csv('filename.csv', index=False)
Here index=False will remove unnecessary indexing/numbering in your csv.
If you want to generate a canonical CSV file, use the csv module.
>>> import csv >>> spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', . quotechar='|', quoting=csv.QUOTE_MINIMAL) >>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) >>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
IMHO a «canonical» CSV would use comma as a delimiter, not ‘ ‘ , and probably ‘»‘ as the quotechar, not ‘|’ .
import csv def writeCsvFile(fname, data, *args, **kwargs): """ @param fname: string, name of file to write @param data: list of list of items Write data to file """ mycsv = csv.writer(open(fname, 'wb'), *args, **kwargs) for row in data: mycsv.writerow(row) mydat = ( ['Name','Age','Grade'], ['Teri', 14, 7], ['John', 8, 2] ) writeCsvFile(r'c:\test.csv', mydat)
I think you need to split out the file opening part of your code so that you can close that later, separately. In this case, you are trying to «close» the writer object. Although the better way is to use «with», this example is more similar to the way you have it:
csvfile = open('test.csv', 'wb') csvwriter = csv.writer(csvfile) for item in pct: csvwriter.writerow(item) csvfile.close()
Carl, whenever you write data into a file what Python actually does is buffer the data and then does its I/O operation with the file (writing the data into the file). This operation is called ‘flushing’ (the buffers). You have to make sure you are close()ing the opened file, if not, buffer won’t be flushed and thus you won’t have anything written in the file.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.21.43541
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Create a .csv file with values from a Python list
If I iterate through the values in the list i.e. for v in mylist: print v they appear to be plain text. And I can put a , between each with print ‘,’.join(mylist) And I can output to a file, i.e.
myfile = open(. ) print >>myfile, ','.join(mylist)
I can’t find an easy way to include the delimiters in the formatting, e.g. I have tried through the join statement. How can I do this?
Thanks everyone, I have combined the ideas from a few answers to solve my question 🙂 I now use the csv module to write the [. ] data straight into a file import csv data = [. ] myfile = open(. ‘wb’) out = csv.writer(open(«myfile.csv»,»w»), delimiter=’,’,quoting=csv.QUOTE_ALL) out.writerow(data) works well, I construct my data[] by grabbing some data out a spreadsheet using xlrd and the csv module writes it out to a file with the right delimiters all good 🙂 ty all again
13 Answers 13
import csv with open(. 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
Edit: this only works with python 2.x.
To make it work with python 3.x replace wb with w (see this SO answer)
with open(. 'w', newline='') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
Do note that the csv module in 2.x does not deal properly with unicodes; see the module documentation for examples on how to deal with this. docs.python.org/library/csv.html
Writerows seems to break up each element in the list into columns if each element is a list as well. This is pretty handy for outputting tables.
That does not work with python 3.4. I am getting TypeError: ‘str’ does not support the buffer interface .
Here is a secure version of Alex Martelli’s:
import csv with open('filename', 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL) wr.writerow(mylist)
If I am using this inside a for loop, should the entire with block be nested under the for loop? Or would it be more efficient to only have wr.writerow(my_list) inside the loop?
@crypdick you should definitely not put the entire block into the loop. Open the file, then write each row in a loop. There’s no need to open the file n times to write n rows.
If you are writing string objects to a file, would suggest using ‘wt’ while opening file to avoid TypeError: a bytes-like object is required, not ‘str’.
To avoid using with , instead use f = open(«myfile.csv»,»w») , out = csv.writer(f, delimiter=’,’,quoting=csv.QUOTE_ALL) , out.writerow([11,22,338]) , f.close()
For another approach, you can use DataFrame in pandas: And it can easily dump the data to csv just like the code below:
import pandas df = pandas.DataFrame(data=) df.to_csv("./file.csv", sep=',',index=False)
Thank you for this code snippet, which may provide some immediate help. A proper explanation would greatly improve its educational value by showing why this is a good solution to the problem, and would make it more useful to future readers with similar, but not identical, questions. Please edit your answer to add explanation, and give an indication of what limitations and assumptions apply.
Also for this to work the lists need to have the same length, otherwise you’ll get a ValueError (pandas v 0.22.0)
The best option I’ve found was using the savetxt from the numpy module:
import numpy as np np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)
In case you have multiple lists that need to be stacked
np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
Use python’s csv module for reading and writing comma or tab-delimited files. The csv module is preferred because it gives you good control over quoting.
For example, here is the worked example for you:
import csv data = ["value %d" % i for i in range(1,4)] out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL) out.writerow(data)
First run is empty and you also cannot delete it then, because it is then opened in python. Second run (or more precise: out = csv.writer(open(«myfile.csv»,»w»), delimiter=’,’,quoting=csv.QUOTE_ALL)) fills the data, no matter if you put open(«myfile.csv»,»w») or a new file open(«myfile2.csv»,»w») . Seems as if the out object cannot deal with the file object built on the run, but stores the output process as a todo. In otherwords: the out object stores the file object in the first run but is only writing when the file object already exists! See the right solution below @Saurabh Adhikary
Jupyter notebook
Let’s say that your list name is A
Then you can code the following and you will have it as a csv file (columns only!)
R="\n".join(A) f = open('Columns.csv','w') f.write(R) f.close()
You could use the string.join method in this case.
Split over a few of lines for clarity — here’s an interactive session
>>> a = ['a','b','c'] >>> first = '", "'.join(a) >>> second = '"%s"' % first >>> print second "a", "b", "c"
However, you may have a problem is your strings have got embedded quotes. If this is the case you’ll need to decide how to escape them.
The CSV module can take care of all of this for you, allowing you to choose between various quoting options (all fields, only fields with quotes and seperators, only non numeric fields, etc) and how to esacpe control charecters (double quotes, or escaped strings). If your values are simple, string.join will probably be OK but if you’re having to manage lots of edge cases, use the module available.
This solutions sounds crazy, but works smooth as honey
import csv with open('filename', 'wb') as myfile: wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n') wr.writerow(mylist)
The file is being written by csvwriter hence csv properties are maintained i.e. comma separated. The delimiter helps in the main part by moving list items to next line, each time.
works, and if you have a nested list, expanding the example of @vy32, you have: data = [[«value %d» % i, «value %d» % (i+1)] for i in range(1,4)] with open(«myfile.txt»,»w») as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter=’\n’) out.writerow([‘;’.join(x) for x in data])
Here is working copy-paste example for Python 3.x with options to define your own delimiter and quote char.
import csv mylist = ['value 1', 'value 2', 'value 3'] with open('employee_file.csv', mode='w') as employee_file: employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) employee_writer.writerow(mylist)
This will generate employee_file.csv that looks like this:
NOTE:
If quoting is set to csv.QUOTE_MINIMAL , then .writerow() will quote fields only if they contain the delimiter or the quotechar. This is the default case.
If quoting is set to csv.QUOTE_ALL , then .writerow() will quote all fields.
If quoting is set to csv.QUOTE_NONNUMERIC , then .writerow() will quote all fields containing text data and convert all numeric fields to the float data type.
If quoting is set to csv.QUOTE_NONE , then .writerow() will escape delimiters instead of quoting them. In this case, you also must provide a value for the escapechar optional parameter.
To create and write into a csv file
The below example demonstrate creating and writing a csv file. to make a dynamic file writer we need to import a package import csv, then need to create an instance of the file with file reference Ex:- with open(«D:\sample.csv»,»w»,newline=»») as file_writer
here if the file does not exist with the mentioned file directory then python will create a same file in the specified directory, and «w» represents write, if you want to read a file then replace «w» with «r» or to append to existing file then «a». newline=»» specifies that it removes an extra empty row for every time you create row so to eliminate empty row we use newline=»», create some field names(column names) using list like fields=[«Names»,»Age»,»Class»], then apply to writer instance like writer=csv.DictWriter(file_writer,fieldnames=fields) here using Dictionary writer and assigning column names, to write column names to csv we use writer.writeheader() and to write values we use writer.writerow() ,while writing file values must be passed using dictionary method , here the key is column name and value is your respective key value
import csv with open("D:\\sample.csv","w",newline="") as file_writer: fields=["Names","Age","Class"] writer=csv.DictWriter(file_writer,fieldnames=fields) writer.writeheader() writer.writerow()
For those looking for less complicated solution. I actually find this one more simplisitic solution that will do similar job:
import pandas as pd a = ['a','b','c'] df = pd.DataFrame() df= df.set_index('a').T df.to_csv('list_a.csv', index=False)
you should use the CSV module for sure , but the chances are , you need to write unicode . For those Who need to write unicode , this is the class from example page , that you can use as a util module:
import csv, codecs, cStringIO class UTF8Recoder: """ Iterator that reads an encoded stream and reencodes the input to UTF-8 """ def __init__(self, f, encoding): self.reader = codecs.getreader(encoding)(f) def __iter__(self): return self def next(self): return self.reader.next().encode("utf-8") class UnicodeReader: """ A CSV reader which will iterate over lines in the CSV file "f", which is encoded in the given encoding. """ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): f = UTF8Recoder(f, encoding) self.reader = csv.reader(f, dialect=dialect, **kwds) def next(self): row = self.reader.next() return [unicode(s, "utf-8") for s in row] def __iter__(self): return self class UnicodeWriter: """ A CSV writer which will write rows to CSV file "f", which is encoded in the given encoding. """ def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): # Redirect output to a queue self.queue = cStringIO.StringIO() self.writer = csv.writer(self.queue, dialect=dialect, **kwds) self.stream = f self.encoder = codecs.getincrementalencoder(encoding)() def writerow(self, row): self.writer.writerow([s.encode("utf-8") for s in row]) # Fetch UTF-8 output from the queue . data = self.queue.getvalue() data = data.decode("utf-8") # . and reencode it into the target encoding data = self.encoder.encode(data) # write to the target stream self.stream.write(data) # empty queue self.queue.truncate(0) def writerows(self, rows): for row in rows: self.writerow(row)