使用xlwt将列表列表写入excel文件

Pra*_*tal 4 python excel xlwt

我有一个列表,如:

[
[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],
]
Run Code Online (Sandbox Code Playgroud)

我想将其插入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
Run Code Online (Sandbox Code Playgroud)

但是这种方法看起来效率不高,因为必须遍历整个列表的每个元素.有没有更有效的方法在python中做同样的事情xlwt

Al.*_*Sal 11

编辑:修正了基准代码中的错误.

你可以缩短一些东西,使它们更加pythonic:

for i, l in enumerate(listdata):
    for j, col in enumerate(l):
        sheet.write(i, j, col)
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有简单的方法可以写入csv.reader.


PS:在您提供的代码中,您永远不会增加rowcol,因此您(0,0)在嵌套for循环的每次迭代时都会覆盖单元格.小心!使用enumerate将解决这个问题.


基准

事实证明,将join每行与逗号一起编写并写入它大约比使用枚举一次快3倍.

这是一些测试代码:

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()
Run Code Online (Sandbox Code Playgroud)

with number = 1(当然除以1):

cell_writer: 15.2915050441

row_writer:0.205128928987

number = 10:

cell_writer: 17.3386430596

row_writer:0.204951626882

我把这个巨大的时间差异归结为join过度写作的速度增加.速度方面最大的瓶颈当然是excel写作.

但是,请注意,在excel中将细胞分开所花费的时间可能会超过使用该row_writer方法节省的时间.它也可能给最终用户带来不便; 运动判断!