I am trying to write a list of float or int into a csvfile row-wise.
for some reason I am able to write them if the list are made up of strings
import csv
even_numbers = ['2','4','6','8'] # list of strings
header = ['even numbers']
with open('even_numbers.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(header)
writer.writerows(even_numbers)
but when there are integers it throws an error
import csv
even_numbers = [2,4,6,8] # list of integers
header = ['even numbers']
with open('even_numbers.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(header)
writer.writerows(even_numbers)
error
---------------------------------------------------------------------------
Error Traceback (most recent call last)
<ipython-input-15-ae817296f34e> in <module>
6 writer = csv.writer(csvfile)
7 writer.writerow(header)
----> 8 writer.writerows(Even_list)
Error: iterable expected, not int
What other ways can I write a list to csv row-wise?
CodePudding user response:
The writerows() method expects a list of lists. A row is a list and the rows are a list of those.
Two solutions, depending on what you want:
even_numbers = [[2, 4, 6, 8]]
or
even_numbers = [[2], [4], [6], [8]]
To do that latter transformation automatically, use:
rows = [[data] for data in even_numbers]
writer.writerows(rows)
CodePudding user response:
According to the documentation, the writeRows
method expects a list of row objects as a parameter.
You can also see the definition of a row object here.
That is:
A row must be an iterable of strings or numbers for Writer objects and a dictionary mapping fieldnames to strings or numbers (by passing them through str() first) for DictWriter objects.
The reason you are getting this message is that it is trying to convert each int in that list as a row itself. The reason it works for strings is that a string itself is iterable. However I suspect you would get unexpected behavior if you tried out a multiple digit number in your list of strings like this:
even_numbers = ['24','45','66','82'] # list of strings
It will likely split out each of the digits as columns in the row, because it is reading the string in as a row object.