57

私は現在 pandas を使用して Excel ファイルを読み取り、そのシート名をユーザーに提示しているので、ユーザーは使用したいシートを選択できます。問題は、ファイルが非常に大きく (70 列 x 65k 行)、ノートブックに読み込むのに最大 14 秒かかることです (CSV ファイル内の同じデータは 3 秒かかります)。

パンダの私のコードは次のようになります。

xls = pandas.ExcelFile(path)
sheets = xls.sheet_names

以前に xlrd を試しましたが、同様の結果が得られました。これはxlrdを使用した私のコードでした:

xls = xlrd.open_workbook(path)
sheets = xls.sheet_names

では、ファイル全体を読み取るよりも Excel ファイルからシート名を取得するためのより高速な方法を提案できる人はいますか?

4

6 に答える 6

75

xlrdライブラリを使用して、"on_demand=True" フラグを指定してワークブックを開くと、シートが自動的に読み込まれなくなります。

パンダと同様の方法でシート名を取得できます。

import xlrd
xls = xlrd.open_workbook(r'<path_to_your_excel_file>', on_demand=True)
print xls.sheet_names() # <- remeber: xlrd sheet_names is a function, not a property
于 2012-09-03T15:12:35.257 に答える
9

標準/一般的なライブラリを使用した私の調査によると、これは2020 年の時点でxlsx/には実装されていませんがxlsxlsb. いずれにせよ、これらのソリューションにより、パフォーマンスが大幅に向上するはずです。、、。xls_xlsxxlsb

以下は、〜10Mbxlsxxlsbファイルでベンチマークされました。

xlsx, xls

from openpyxl import load_workbook

def get_sheetnames_xlsx(filepath):
    wb = load_workbook(filepath, read_only=True, keep_links=False)
    return wb.sheetnames

ベンチマーク: ~ 14 倍の速度向上

# get_sheetnames_xlsx vs pd.read_excel
225 ms ± 6.21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
3.25 s ± 140 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

xlsb

from pyxlsb import open_workbook

def get_sheetnames_xlsb(filepath):
  with open_workbook(filepath) as wb:
     return wb.sheets

ベンチマーク: ~ 56x の速度向上

# get_sheetnames_xlsb vs pd.read_excel
96.4 ms ± 1.61 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
5.36 s ± 162 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

ノート:

于 2020-11-09T21:25:57.977 に答える