我有一些单页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))
这不会给我我正在寻找的列表,而是一个生成器对象列表。我在这里做错了什么,如何获得我正在寻找的清单?
答案 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)])