2016-11-12 11 views
4

Openpyxlとpython3.5を使用して、添字を使用してExcelワークシートの最初の行を取得しようとしましたが、エラーが発生しました。最初の行の取得に関連しOpenpyxlインデックスでワークシートから行を取得する方法

# after getting filename 
# after loading worksheet 
# to get the first row of the worksheet 
first_row = worksheet.rows[0] 

# I get 
Traceback (most recent call last): 
     File "<pyshell#54>", line 1, in <module> 
     first_row = phc_th_sheet.rows[1] 
TypeError: 'generator' object is not subscriptable 

、私はまた、ワークシート= FIRST_ROWを試みた(行= 1) #と FIRST_ROW = worksheet.rows。[1]

どれも働きました。 openpyxlでは何の提案もありませんか? 私はhttps://openpyxl.readthedocs.io/en/default/にある文書に行ってきましたが、行の索引付けと選択に役立つものは何も見つかりませんでした。

+0

これはドキュメントに記載されています。 –

答えて

9

私は最終的にドキュメントの答えが見つかりました:

first_row = worksheet.rows[1] 
# worksheet.rows[row_index_from_1] 

これは私のために働きました。

+1

はい、私たちは 'ws.rows'をジェネレータに変換して、異なる実装間の動作が一貫し、アドホッククエリのこの構文を奨励するようにしました。プログラムによるアクセスは、 'ws.iter_rows()'と、可能な場合は 'ws.iter_cols()'を使って行うのが最適です。 –

+2

これはもう動作しません。 –

+0

これはworksheet.rows [1]になりました。答えを更新するつもりです。 –

7

エラーTypeError: 'generator' object is not subscriptable。あなたがそれを反復するときに要素を作成するため、インデックスを使ってジェネレータにアクセスしようとしていることを意味します。

first_row = list(worksheet.rows)[0] 

または反復行を考えた::

for row in worksheet.rows: 
    foo(row) 

の両方がある場合でも、これは

あなたは簡単にそれを解決することができますが、あなたが望む要素を取得するには、リストにキャストイテラブル、リスト、ジェネレータは全く異なる振る舞いをすることができます。

https://wiki.python.org/moin/Generators

https://docs.python.org/3/library/stdtypes.html#iterator-types

https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range

+0

これは素晴らしい答えではありません。イテレータをリストに明示的に変換するのではなく、行を直接取得するほうがよいでしょう。 –

+2

そうです。しかし、私は通常、パンダでスプレッドシートを操作し、openpyxlの内部についてはよく知らないので、エラーの説明と回避策を得る方法を試してみました。 –

関連する問題