2017-03-05 12 views
0
import openpyxl 
wb = openpyxl.load_workbook('example.xlsx') 
sheet = wb.active 
sheet.columns[1] 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    sheet.columns[1] 
TypeError: 'generator' object is not subscriptable 

Ich bin ein Anfänger in Python und das ist das erste Mal für mich, meine Frage zu posten. Ich stehe mit dem obigen TypeError fest und sage, 'Generator' Objekt ist nicht einklagbar. Ich glaube, ich habe den auf einer Website geschriebenen Code genau eingegeben. Die URL der Website ist https://automatetheboringstuff.com/chapter12/TypeError: 'generator' Objekt ist nicht einklagbar

Bitte helfen Sie mir, mit diesem Fehler umzugehen.

+0

Dieser Code funktioniert für mich. Wie @slai vorgeschlagen, überprüfen Sie Ihre Daten. –

+0

Leider wurde das Buch nicht aktualisiert, um Änderungen in der API widerzuspiegeln. Für Ad-hoc-Zugriff verwenden Sie Pythons Slicing Notation z. 'ws ['A']', um eine Liste der Zellen in Spalte A zu erhalten. –

Antwort

5

Dieses Tutorial wurde für eine ältere Version der openpyxl-Bibliothek entwickelt, 2.3.3. Seitdem hat sich das Verhalten von .columns ein wenig verändert - ich bin zu faul, um genau nachzusehen, wann - und jetzt erzeugt es stattdessen einen Generator (ein faules Objekt, das eigentlich keine Arbeit macht, wenn es nicht verlangt wird.)

Wenn Sie nicht viel über die Leistung kümmern, könnten Sie list am Generator rufen, dass .columns zurückkehrt und dann die entsprechende Spalte auswählen:

>>> sheet.columns[0] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'generator' object is not subscriptable 
>>> list(sheet.columns)[0] 
(<Cell Sheet1.A1>, <Cell Sheet1.A2>, <Cell Sheet1.A3>, <Cell Sheet1.A4>, <Cell Sheet1.A5>, <Cell Sheet1.A6>, <Cell Sheet1.A7>) 
>>> list(sheet.columns)[1] 
(<Cell Sheet1.B1>, <Cell Sheet1.B2>, <Cell Sheet1.B3>, <Cell Sheet1.B4>, <Cell Sheet1.B5>, <Cell Sheet1.B6>, <Cell Sheet1.B7>) 

Oder wählen Sie die Spalte nach Name:

>>> sheet["A"] 
(<Cell Sheet1.A1>, <Cell Sheet1.A2>, <Cell Sheet1.A3>, <Cell Sheet1.A4>, <Cell Sheet1.A5>, <Cell Sheet1.A6>, <Cell Sheet1.A7>) 

Oder - und das könnte am einfachsten sein, je nachdem, wie viel Zeit Sie anderen möglichen Problemen widmen möchten - Sie können einfach auf 2.3.3 herunterstufen.

+0

Vielen Dank für Ihre Antwort. Wenn es Ihnen nichts ausmacht, sagen Sie mir bitte, wie Sie auf 2.3.3 herunterstufen können. Ehrlich gesagt, ich habe keine Ahnung von der openpyxl 2.3.3. – User9712

+0

Wie hast du openpxl überhaupt installiert? Mit Pip? Conda? – DSM

+0

Entschuldigung für meine späte Antwort. Ich habe openpyx mit pip installiert. – User9712

1

Wie in Paket in der Dokumentation angegeben, seit der Version 2.4.0:

ws.rows and ws.columns now always return generators and start at the top of the worksheet

Also, wenn Sie 1 Spalte erhalten möchten, können Sie (zusätzlich zu den Möglichkeiten, bereits von DSM vorgeschlagen) next() Funktion am Generator verwenden :

next(sheet.columns) 

Aber wenn Sie noch openpyxl auf die Version in dem Buch verwendet degradieren wollen, versuchen Sie:

pip install -I openpyxl==2.3.3 
Verwandte Themen