Ich habe eine Reihe von Excel-Dateien mit einem Blatt und möchte eine Liste mit Unterlisten erstellen. Jede Unterliste soll 1) den Dateinamen, 2) den Blattnamen und 3) die Zeilenwerte für jede Zeile im Blatt mit Ausnahme der ersten (Kopf-) Zeile enthalten. Ich habe folgendes versucht:

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

Dies gibt mir nicht die Liste, nach der ich suche, sondern eine Liste von Generatorobjekten. Was mache ich hier falsch und wie kann ich die gesuchte Liste erhalten?

1
RubenGeert 5 Dez. 2012 im 11:30

3 Antworten

Beste Antwort

Es sieht so aus, als ob Ihr Listenverständnis falsch ist. Es sollte lauten:

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

Außerdem würde ich empfehlen, s1 = wb.sheets () [0] einzurichten, um den Code besser lesbar und etwas schneller zu machen

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

Außerdem haben Sie in Ihrem Kommentar erwähnt, dass Sie sehen möchten, wie dies mit mehreren Blättern geschieht. Angenommen, Ihre Felder in jedem sind die gleichen, könnten Sie dies verwenden:

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
Michael David Watson 5 Dez. 2012 im 08:17

Vielen Dank an alle für die Eingabe! Die Liste, die ich brauchte, wird von generiert

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)])
0
RubenGeert 5 Dez. 2012 im 10:42

Sie sind sich nicht sicher, was Sie wollen. Ich denke, das Problem ist, dass Sie [] im Listenverständnis fehlen.

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

Dann sollte Ihre endgültige Liste ["Dateiname", "Arbeitsblattname", [Zeilenwertliste] sein]

Seien wir einfach:

>>> 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']]] 
2
Shawn Zhang 5 Dez. 2012 im 07:50