我有一个列表,如:
[
[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
?
答案 0 :(得分:11)
编辑:修正了基准代码中的错误。
你可以缩短一些东西,使它们更加pythonic:
for i, l in enumerate(listdata):
for j, col in enumerate(l):
sheet.write(i, j, col)
但据我所知,没有简单的方法可以写入csv.reader
。
PS:在您提供的代码中,您永远不会增加row
或col
,因此您会在嵌套for循环的每次迭代时覆盖(0,0)
处的单元格。小心!使用enumerate
将解决这个问题。
事实证明,{{1}将每一行与逗号一起编写并写入它大约比使用枚举一次快3倍。
这是一些测试代码:
join
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()
(当然除以1):
cell_writer:
number = 1
row_writer :
15.2915050441
0.205128928987
:
cell_writer:
number = 10
row_writer :
17.3386430596
我将大的时差归因于0.204951626882
比写入Excel更快的速度。速度方面最大的瓶颈当然是excel写作。
但是,请注意,在excel中拆分单元格所需的时间可能会超过使用join
方法节省的时间。它也可能给最终用户带来不便;运动判断!