11

10x5324 セルの xlsx ファイルを読み取る必要があります

これは私がやろうとしていたことの要点です:

from openpyxl import load_workbook
filename = 'file_path'

wb = load_workbook(filename)
ws = wb.get_sheet_by_name('LOG')

col = {'Time':0 ...}

for i in ws.columns[col['Time']][1:]:
    print i.value.hour

コードの実行に時間がかかりすぎて(印刷ではなく操作を実行していた)、しばらくして焦ってキャンセルしました。

最適化されたリーダーでどのように作業できるか考えていますか? すべての行ではなく、行の範囲を反復処理する必要があります。これは私が試したものですが、間違っています:

wb = load_workbook(filename, use_iterators = True)
ws = wb.get_sheet_by_name('LOG')
for i in ws.iter_rows[1:]:
    print i[col['Time']].value.hour

範囲機能なしでそれを行う方法はありますか?

それを行う1つの方法は次のようになると思います:

for i in ws.iter_rows[1:]:
    if i.row == startrow:
        continue
    print i[col['Time']].value.hour
    if i.row == endrow:
        break

しかし、よりエレガントなソリューションはありますか? (どちらも機能しません)

4

2 に答える 2

5

ドキュメントから:

注: ワークシートがメモリ内に作成されるとき、セルは含まれません。最初にアクセスしたときに作成されます。この方法では、決してアクセスされないオブジェクトを作成しないため、メモリ フットプリントが削減されます。

警告: この機能により、セルに直接アクセスする代わりにセルをスクロールすると、値を割り当てなくても、すべてのセルがメモリ内に作成されます。何かのようなもの

>>> for i in xrange(0,100):
...             for j in xrange(0,100):
...                     ws.cell(row = i, column = j)

メモリ内に 100x100 個のセルを無料で作成します。

ただし、これらの不要なセルをすべてきれいにする方法があります。これについては後で説明します。

列または行のプロパティにアクセスすると、多くのセルをメモリにロードする必要があると思います。必要なセルに直接アクセスすることだけをお勧めします。

例えば。

col_name = 'A'
start_row = 1
end_row = 99

range_expr = "{col}{start_row}:{col}{end_row}".format(
    col=col_name, start_row=start_row, end_row=end_row)

for (time_cell,) in ws.iter_rows(range_string=range_expr):
    print time_cell.value.hour
于 2012-05-16T10:20:45.817 に答える