2016-04-13 9 views
2

openpyxlで大きなエクセルファイルを読み込んだり、load_workbook()でread_onlyパラメータを読み込んだりすることについてここでかなりの質問がありました。 50x30ですが、30x1100枚のブックでそれをやろうとすると、それは失速します。今は、Excelを読み込んで多次元配列に変換するだけです。openpyxlでread_onlyを使ってexcelで300kのセルを読むのが不十分です

from openpyxl import Workbook 
from openpyxl import load_workbook 


def transferCols(refws,mx,refCol,newCol,header): 
    rmax = refws.max_row 

    for r in range(1, rmax+1): 
     if (r == 1): 
      mx[r-1][newCol-1] = header 
     else: 
      mx[r-1][newCol-1] = refws.cell(row = r, column = refCol).value 


    return 

ref_wb = load_workbook("UESfull.xlsx", read_only= True) 
ref_ws = ref_wb.active 
rmax = ref_ws.max_row 

matrix = [["fill" for col in range(30)] for row in range(rmax)] 
print("step ", 1) 
transferCols(ref_ws,matrix,1,1,"URL") 
... 

私は唯一の進行状況を追跡するために、印刷(「ステップ」)の行を置くが、驚くべきことに、ステップ1で失速!私は構造が貧弱か300k細胞がopenpyxlにはあまりにも多いかどうかは分かりません。私はまだ私のput excelに書くことを始めたhaventまだ!前もって感謝します!

+0

それはまた、あなたが[基本的な読み取り専用の例]を使用する場合、何も印刷に失敗ん( docsからhttps://openpyxl.readthedocs.org/en/default/optimized.html)をダウンロードしますか?それが単純な2Dシートだったのならば、私はMicrosoft OfficeにCSVとして保存し、Pythonでそれを1行ずつ読むことになるだろう – jDo

+0

読んだ後にデータをどうしたいのですか?あなたは 'pandas' – Abbas

+0

こんにちは@Abbasのソリューションを持っているかもしれません。私は本当にここにこだわっている。私は、大きな2DのExcelシートを読み込み、すべてのエントリが一様なフォーマットになるようにデータを消去し、それを保存する必要があります。シンプルだけどリソース集約的ですか?後続のコードはtransferCols()の複数の呼び出しです。 Excelを読み込んでローカルの2Dマトリックスに保存すると思ったのですが、編集する前にそれをExcelに書き込むほうが速いでしょう。 – Philong

答えて

0

ワークシートが変更されていないと思われますので、ws.max_rowは不明です。この場合、ws.calculate_dimensions()を使用すると、両方のシートの行を並行して反復処理するだけです。

+0

私はテストラインの印刷を実行すると(ws._calculate_dimension())私は トレースバック(最新の呼び出しの最後)を取得:プリントにファイル "/XLCleaner.py"、ライン319を、(ref_ws._calculate_dimension()) ファイル "/lib/python3.5/site-packages/openpyxl/worksheet/read_only.py"、行214、_calculate_dimension max_col = max(max_col、cell.column) TypeError:順序付け不可能な型:なし型()> int ) 興味深いのは、ws.max_rowがExcelシートから適切な行数(11,000)を返すことです。私は単純に50の行を残すためにすべての行を削除すると、プログラムは広告として実行されます。 – Philong

+0

ファイルが破損している可能性があります。読み込み専用ファイルから行を削除することはできませんので、私はあなたが何を意味するのか分かりません。いずれにしても、わずか11,000行で、すべてをメモリに保存しても問題ありません。あるいは、 'ws.iter_rows()'を使うようにコードを書き直してください。私はあなたのコードをあまり理解できません。 –

+0

申し訳ありませんが、私はより明確にすべきでした。私は自分のコードをテストするために、手動でMS Excelに入り、行を削除して負荷を軽減しました。私のコードが有効であることを確認したら、元のExcelシート(11,000行)で実行しました。 @チャーリークラーク。私は試してみていただきありがとうございます – Philong

-1

openpyxlを試してみてください。pandasをお試しください。パンダには、あなたがするべきデータをきれいにする機能があります。ここで

が書かれており、パンダに読み戻される10000行とデータの30列の例です:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.randn(10000,30)) 
df.to_excel('test.xlsx') 
df1 = pd.read_excel('test.xlsx') 
+0

Pandasは内部的に 'xlrd'ライブラリを使用してExcelファイルを読み取ります。あなたがやりたいことに応じて、これがケースの1つですが、openpyxlの読み取り専用モードが適しています。 –

+0

@CharlieClarkでは 'openpyxl'読み取り専用モードがより適していますが、OPは300K +セルを使ってExcelを読み取ることができません。これは' pandas'が300Kセルを読み取る方法を示す例です。 – Abbas

+0

いいえ、ファイルの読み取りに問題はありません。サイズはここでは関係ありません。使用されるコードは、シートのディメンションをXMLの先頭に置くオプションの最適化に依存しています。これがなければ、実際にはあなたはそれを使うことはできませんが、セルはまだ読み込めます。また、上記のように、openpyxlはメモリ内の300kのセルを簡単に処理できます。 –

関連する問題