web-dev-qa-db-ja.com

パンダでread_Excelを使用してプロセス速度を上げる方法は?

すべてのシートを1つのExcelファイルで処理するには、pd.read_Excelを使用する必要があります。
しかし、ほとんどの場合、私はシート名を知りませんでした。
だから私はこれを使ってExcelのシート数を判断します:

i_sheet_count=0
i=0
try:
  df.read_Excel('/tmp/1.xlsx',sheetname=i)
  i_sheet_count+=1
  i+=1
else:
  i+=1
print(i_sheet_count)

プロセス中に、プロセスがかなり遅いことがわかりました、
それで、速度を改善するためにread_Excel限られた行のみを読み取ることができますか?
試しましたnrowsが動作しませんでした。

6
james.peng

こんにちは james

私はpandas対Excelを実行しています(むしろpandasagainstExcel))今ここに私のアプローチです。

シート名

tryオーバーヘッドを回避するために、私はこれですべてのシート名を読み取っています。

import xlrd
xls = xlrd.open_workbook('file.xlsx', on_demand=True)
Labels = xls.sheet_names()

on_demand=Trueパラメータは、絶対に必要になるまで実際のデータ読み取りが発生しないことを保証します。これは、ここで必要なのはシート名のリストだけなので、良いことです。

データ読み取り

pandasと入力します。私の問題は-私は信じています-各シートに複数のデータblobがあり、これらのそれぞれを正確に示す必要があるため、あなたの問題よりも悪いです。あなたのケースでは、あなたは単に上記のようにすることができます:

dfs = {}
for sheet in sheet_names:
    dfs[sheet] = pd.read_Excel('file.xlsx', sheet)

実際、シート名を読み取るための jpp の解決策を見て、それを借りることを考えています( 模倣はお世辞の誠実な形式です )。シート名をどこかに保存するために、私はすでに辞書のことをしていました。

パフォーマンス

最後に、どうしようもないほど遅い体験にどう対処すればよいですか?すでに述べたように、読み取りはより複雑ですが、ソースファイルは1つだけで、変更されません。

これを念頭に置いて、私がしていることは、読み終わったらすぐにすべてをcsvにエクスポートすることです。私がMicrosoftという名前に関連していると推測できるいくつかの神秘的な理由のため、すべてのテキスト解析でcsvを読むこともxlsxより何倍も高速です。

私のエクスポートコードはこれです:

if glob('*.csv') != CSVS:
    for label, csvlabel in Zip(Labels, CSVS):
        print(f'Exporting {label} to {csvlabel}...')
        data[label].to_csv(csvlabel)

CSVSは、シート名に基づいたcsvファイル名のリストです(ただし、多少は問題ありません)。つまり、基本的にはcsvsの存在をテストしていますが、ifを無視して上書きすることもできます。

VBAスクリプトに関しては、あなたの精神科医にスピードダイヤルを教えてもらえれば幸いです。その後、薬が必要になるか、あるいは剖検が必要になるでしょう。 Excelデータblobを選択/コピーして、メモ帳に貼り付けるか、単にpd.read_clipboardそれら。

0
Ricardo