1

我有许多单张 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))

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

4

3 回答 3

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']]] 
于 2012-12-05T07:44:53.057 回答
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)])
于 2012-12-05T07:50:33.653 回答
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)])
于 2012-12-05T10:42:54.553 回答