【问题标题】:Code creates generator object but I'd like a list instead代码创建生成器对象,但我想要一个列表
【发布时间】:2012-12-05 07:30:58
【问题描述】:

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

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

【问题讨论】:

  • 你能发布你想要的结果吗?当前的输出是多少?

标签: python list generator


【解决方案1】:

您的列表理解似乎不正确。它应该是:

    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)])

【讨论】:

  • 你还在用spss/python/excel做什么?我用 win32com 编写了一些非常糟糕的 com 服务器,将统计数据直接集成到 excel 中。
  • 这里的最终目标是将 Excel 工作簿中的数据放入单个 SPSS DataSet。如果我将 Excel 数据合并到 Python 中的单个对象中,然后将其传递给 DataSet,这似乎效果最好。我已经为单个多页工作簿启动并运行它;-D 不过,现在我想要多个单页工作簿。
【解决方案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']]] 

【讨论】:

  • 谢谢。我宁愿不将 row_values 作为嵌套列表。所以不是 ["Filename","WorksheetName",[row_value list]] 我想要 ["Filename","Sheetname",row_value_1,row_value_2,...,row_value_n]
  • (1)如果 row_value_1 是第 1 行数据的列表,我的代码可以很好地为您服务。 (2) 但是如果你的意思是 row_value_1 代表 row1 中的单元格值,row_value_2 是 row1 中的第二个单元格值。需要通过 itertools chain() 函数展平列表。
  • 恐怕我要找的是 2):row_value_1 是单元格值(通常的 Excel 表示法中的 $A$2)。那么使用 itertools.chain() 我可以生成所需的格式吗?
  • Yes..chain(itr....) 将返回提供的迭代器的元素,在第一个迭代器耗尽后,它将返回第二个迭代器的元素,依此类推..
【解决方案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))
    ws=wb.sheets()[0]
    for row in range(1,ws.nrows):
        allData.append([fil]+[ws.name]+[val for val in ws.row_values(row)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2011-07-24
    相关资源
    最近更新 更多