代码创建生成器对象,但我想要一个列表

时间:2012-12-05 07:30:58

标签: python list generator

我有一些单页Excel文件,我想创建一个包含子列表的列表。每个子列表应包含1)文件名,2)工作表名称和3)工作表中除第一(标题)行之外的每一行的行值。我尝试了以下方法:

rdir=r"d:\temp"
import xlrd,spss
fils=[fil for fil in os.listdir(rdir) if fil.endswith(".xls")]
allData=[]
for cnt,fil in enumerate(fils):
    wb=xlrd.open_workbook(os.path.join(rdir,fil))
    allData.append([fil]+[wb.sheets()[0].name]+wb.sheets()[0].row_values(row) for row in range(1,wb.sheets()[0].nrows))

这不会给我我正在寻找的列表,而是一个生成器对象列表。我在这里做错了什么,如何获得我正在寻找的清单?

3 个答案:

答案 0 :(得分:2)

不确定你想要什么,我猜问题是你在列表理解上缺少[]。

allData.append([fil]+[wb.sheets()[0].name]+ [ wb.sheets()[0].row_values(row) for row in range(1,wb.sheets()[0].nrows) ] )

那么你的最终列表应该是[“Filename”,“WorksheetName”,[row_value list]]

让我们变得简单:

>>> list_a = [1,2,3]
>>> list_b = [ ['a','b','c'],['a','b','c'],['a','b','c']]
>>> [list_a + x for x in list_b]
[[1, 2, 3, 'a', 'b', 'c'], [1, 2, 3, 'a', 'b', 'c'], [1, 2, 3, 'a', 'b', 'c']]
>>> [list_a + [ x for x in list_b ] ]
[[1, 2, 3, ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]] 

答案 1 :(得分:2)

看起来您的列表理解不正确。它应该是:

    allData.append([fil]+[wb.sheets()[0].name]+[wb.sheets()[0].row_values(row) for row in range(1,wb.sheets()[0].nrows)])

另外我建议建立s1 = wb.sheets()[0]以使代码更清晰,更快一点

rdir=r"d:\temp"
import xlrd,spss
fils=[fil for fil in os.listdir(rdir) if fil.endswith(".xls")]
allData=[]
for cnt,fil in enumerate(fils):
    wb=xlrd.open_workbook(os.path.join(rdir,fil))
    s1 = wb.sheets()[0]
    allData.append([fil]+[s1.name]+[s1.row_values(row) for row in range(1,s1.nrows)])

您还在评论中提到,您希望了解如何使用多个工作表执行此操作。假设您的每个字段都相同,您可以使用它:

rdir=r"d:\temp"
import xlrd,spss
fils=[fil for fil in os.listdir(rdir) if fil.endswith(".xls")]
allData=[]
for cnt,fil in enumerate(fils):
    wb=xlrd.open_workbook(os.path.join(rdir,fil))
    for sheet in wb.sheets():
        allData.append([fil]+[sheet.name]+[sheet.row_values(row) for row in range(1,sheet.nrows)])

答案 2 :(得分:0)

感谢大家的所有投入!我需要的清单是由

生成的
rdir=r"d:\temp"
import xlrd,spss
fils=[fil for fil in os.listdir(rdir) if fil.endswith(".xls")]
allData=[]
for cnt,fil in enumerate(fils):
    wb=xlrd.open_workbook(os.path.join(rdir,fil))
    ws=wb.sheets()[0]
    for row in range(1,ws.nrows):
        allData.append([fil]+[ws.name]+[val for val in ws.row_values(row)])