[英]Write list of lists to excel file using xlwt
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. 我想将其插入excel文件。 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
? 有没有更有效的方法在python中使用xlwt
做同样的xlwt
?
EDIT : Fixed error in benchmark code. 编辑 :修正了基准代码中的错误。
You can shorten things a bit to make them more pythonic: 你可以缩短一些东西,使它们更加pythonic:
for i, l in enumerate(listdata):
for j, col in enumerate(l):
sheet.write(i, j, col)
But as far as I know there is no easy method to write to as there is with csv.reader
. 但据我所知,没有简单的方法可以写入csv.reader
。
PS: In your supplied code, you never increment row
or col
, so you overwrite the cell at (0,0)
every iteration of the nested for loop. PS:在您提供的代码中,您永远不会增加row
或col
,因此在嵌套for循环的每次迭代时都会在(0,0)
处覆盖单元格。 Careful! 小心! Using enumerate
will fix that. 使用enumerate
将解决这个问题。
As it turns out, join
ing each row together with a comma and writing it is roughly 3 times faster than using enumerate once. 事实证明,用逗号join
每一行并写入它大约比使用枚举一次快3倍。
Here's some test code: 这是一些测试代码:
import xlwt
import timeit
def wrapper(fn, *args, **kwargs):
def wrapped():
return fn(*args, **kwargs)
return wrapped
def excel_writer():
xldoc = xlwt.Workbook()
sheet1 = xldoc.add_sheet("Sheet1", cell_overwrite_ok=True)
rows = [[str(y) for y in xrange(100)] for x in xrange(10000)]
fn1 = wrapper(cell_writer, rows, sheet1)
fn2 = wrapper(row_writer, rows, sheet1)
print timeit.timeit(fn1, number=10)/10
print timeit.timeit(fn2, number=10)/10
xldoc.save('myexcel.xls')
def cell_writer(rows, sheet):
for i, row in enumerate(rows):
for j, col in enumerate(row):
sheet.write(i, j, col)
def row_writer(rows, sheet):
rows = [', '.join(row) for row in rows]
for i, strrow in enumerate(rows):
sheet.write(i, 0, strrow)
if __name__ == '__main__':
excel_writer()
with number = 1
(divided by 1 of course): number = 1
(当然除以1):
cell_writer:
15.2915050441
cell_writer:15.2915050441
row_writer :
0.205128928987
row_writer :0.205128928987
with number = 10
: number = 10
:
cell_writer:
17.3386430596
cell_writer:17.3386430596
row_writer :
0.204951626882
row_writer :0.204951626882
I attribute the big time difference to the increased speed of join
over writing to excel. 我将大的时间差异归结为join
写入excel的速度。 The biggest bottleneck in terms of speed, of course, the excel writing. 速度方面最大的瓶颈当然是excel写作。
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. 但是,请注意,在excel中拆分单元格所需的时间可能会超过使用row_writer
方法节省的时间。 It may also inconvenience the end user; 它也可能给最终用户带来不便; exercise judgement! 运动判断!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.