首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xlwt将列表列表写入excel文件

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

Stack Overflow用户
提问于 2014-08-14 20:15:17
回答 1查看 15.8K关注 0票数 4

我有一个列表,如:

代码语言:javascript
复制
[
[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文件中。可以通过编写每个元素来逐个完成此操作。

代码语言:javascript
复制
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来做同样的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-14 20:20:40

编辑:修复基准代码错误。

你可以把东西缩短一点,让它们更有pythonic风格:

代码语言:javascript
复制
for i, l in enumerate(listdata):
    for j, col in enumerate(l):
        sheet.write(i, j, col)

但据我所知,没有像csv.reader那样容易写的方法。

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

基准测试

事实证明,使用join将每一行与逗号一起并写入它大约比使用enumerate once快3倍。

下面是一些测试代码:

代码语言:javascript
复制
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_writer0.205128928987

使用number = 10

cell_writer:17.3386430596

row_writer0.204951626882

我将这种巨大的时间差归因于join比写入excel的速度更快。速度方面的最大瓶颈,当然是excel写作。

但是,请注意,在excel中拆分单元格所花费的时间可能会超过使用row_writer方法节省的时间。这也可能会给最终用户带来不便;请自行判断!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25307848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档