使用xlwt将列表的列表写入excel文件
我有一个列表如下:
[ [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], ]
我想插入到一个Excel文件。 通过编写每个元素可以一个接一个地完成。
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
但是这种方法看起来效率不高,因为整个列表的每个元素都必须被遍历。 是否有一个更有效的方法来做同样的python与xlwt
?
编辑 :修正了基准代码中的错误。
你可以缩短一些东西,使它们更加pythonic:
for i, l in enumerate(listdata): for j, col in enumerate(l): sheet.write(i, j, col)
但据我所知,有没有简单的方法来写,因为有csv.reader
。
PS:在你提供的代码中,你永远不会增加row
或col
,所以你在(0,0)
处嵌套for循环的每一次迭代覆盖单元格。 小心! 使用enumerate
将解决这个问题。
基准
事实certificate,用逗号join
每一行并写入比使用一次枚举快3倍。
以下是一些testing代码:
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()
number = 1
(当然除以1):
cell_writer:
15.2915050441
row_writer :
0.205128928987
number = 10
:
cell_writer:
17.3386430596
row_writer :
0.204951626882
我把这个大的时间差异归功于加速写入excel的速度。 速度方面最大的瓶颈,当然是优秀的写作。
但是请注意,在Excel中拆分单元格的时间可能会超过row_writer
方法保存的时间。 这也可能给最终用户带来不便。 行使判断!