I have a list of lists like:
[
[u'email', u'salutation', u'firstname', u'lastname', u'remarks', None, None, None, None, None],
[u'harry@harrypotter.com', u'Mr', u'Daniel', u'Radcliffe', u'expecto patronum', None, None, None, None, None],
[u'snape@harrypotter.com', u'Mr', u'Severus', u'Snape', u'Always', None, None, None, None, None],
]
I want to insert this to an excel file. It is possible to do so one by one by writing each element.
book = xlwt.Workbook(encoding="utf-8")
sheet1 = book.add_sheet("Sheet 1")
row = 0
for l in listdata:
col = 0
for e in l:
if e:
sheet1.write(row, col, e)
col+=1
row+=1
But this method does not look very efficient as the each element of the entire list has to be traversed. Is there a more efficient method to do the same in python with xlwt
?
EDIT: Fixed error in benchmark code.
You can shorten things a bit to make them more pythonic:
But as far as I know there is no easy method to write to as there is with
csv.reader
.PS: In your supplied code, you never increment
row
orcol
, so you overwrite the cell at(0,0)
every iteration of the nested for loop. Careful! Usingenumerate
will fix that.Benchmarks
As it turns out,
join
ing each row together with a comma and writing it is roughly 3 times faster than using enumerate once.Here's some test code:
with
number = 1
(divided by 1 of course):with
number = 10
:I attribute the big time difference to the increased speed of
join
over writing to excel. The biggest bottleneck in terms of speed, of course, the excel writing.However, be aware that the time it takes to split the cells apart in excel may outweigh the time saved with the
row_writer
approach. It may also inconvenience the end user; exercise judgement!