2012-12-05 17 views
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)) 

這不會給我我正在尋找的列表,而是一個生成器對象的列表。我在這裏做錯了什麼,我如何獲得我正在尋找的名單?

+0

你能發佈你想要的結果嗎?目前的產量是多少? –

回答

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

另外你在用spss/python/excel做什麼?我用win32com編寫了一些非常邪惡的com服務器,它們將統計信息直接整合到excel中。 –

+0

這裏的最終目標是將Excel工作簿中的數據導入到單個SPSS DataSet中。如果我將Excel數據合併到Python中的單個對象中,然後將其傳遞給DataSet,這似乎工作得最好。我已經完成並運行了一個多頁工作簿; -D現在我想要多個單頁工作簿。 – RubenGeert

+0

查看我的編輯,瞭解如何執行此操作的示例... –

2

不知道你想要什麼,我想問題是你在列表理解上的缺失[]。

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

那麼你的最終名單應該是[ 「文件名」, 「WorksheetName」,[row_value列表]

讓我們簡單:

>>> 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']]] 
+0

謝謝。我寧願沒有row_values作爲嵌套列表。所以,而不是[「文件名」,「WorksheetName」,[row_value列表]]我想[[文件名],「Sheetname」,row_value_1,row_value_2,...,row_value_n] – RubenGeert

+0

(1)如果row_value_1是數據在第1行,我的代碼爲您提供了很好的服務。 (2)但是,如果您的意思是row_value_1代表第1行中的單元格值,則row_value_2是第1行中的第二個單元格值。需要通過itertools chain()函數將列表平坦化。 –

+0

恐怕我要找的是2):row_value_1是單元格的值(在通常的Excel表示法中$ A $ 2)。所以通過itertools.chain()我可以生成所需的格式? – RubenGeert

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)]) 
相關問題