2017-03-13 224 views
-1

私はxlsxファイルを所有しています。各行には30個の列があります。openpyxlを使用して情報全体をリストに保存します。python openpyxlの読み込みが遅すぎる

def get_value(i,ws,article_row): 
    value=ws.cell(row=article_row,column=i).value 
    i+=1 
    return value,i 
def geneList(f): 
    wb = load_workbook(filename=f, read_only=True) 
    ws = wb.worksheets[0] 
    max_row = ws.max_row 
    info_list=[] 
    for ar_row in range(2,max_row+1): 
     i=3#start from the 3rd column: sourceid 
     sourceID,i=get_value(i,ws,ar_row) 
     pv,i=get_value(i,ws,ar_row) 
     pubtype,i=get_value(i,ws,ar_row) 
...... 
     item_dict={'sourceID':sourceID,'pv':pv,'pubtype':pubtype, 
        ...} 
    info_list.append(item_dict) 

すべての情報を読むには約20分かかります。私はこの問題を解決する方法を知らないのですか?それは、情報を解析するのを遅らせることです。 .xlsxを.csvに変換しますか?または、別のツールを使って読む?

+0

完全なコードを投稿してください。ただし、読み取り専用ファイルに正しいAPIを使用していないため問題が疑われます。 –

+0

https://gitlab.com/antmomo/evan_test/blob/32dae4566daa13e9388527da1a84be96ab03499a/contribution_journal.py –

答えて

0

xlwingsを使用できます。非常に高速で使いやすいです。

+0

大丈夫、勉強します –

+0

最初は、Anacondaのパッケージ(GoogleアナンサのPythonで検索)をインストールできます。このパッケージには多くのモジュール(xlwingsを含む)があります。その後、import xlwignsをxwとしてインポートすることができます。既に開いている本に接続するには、xb = xw.book()を使用し、最後にxw.Range( "A1:B2")。valueを使用して定義された範囲内の値を取得します。 xlwignsのWebサイトにある詳細については、ドキュメントを参照してください。 – rvcristiand

1

この問題は、読み取り専用モードでのcellメソッドの広範な使用に関連しています。読み取り専用モードでは、openpyxlはオンデマンドで適切なワークシートを読み取り、メモリー使用量を少なくしますが、すべてのルックアップでXMLが再度解析されることを意味します。あなたが書き直したコードは、明らかに遅いすべての行のすべてのセルに対してファイルを再解析するようにopenpyxlに強制します。これは、行ベースのアクセス用のAPIがあるため、まったく必要ありません。関連する区切り文字でws.iter_rows()を使用して、必要なセルを取得してください。

+0

ありがとう! ws.iter_rows()を使用して情報全体を取得するのは非常に高速です。しかし、私はdata_onlyとread_onlyモードを使って対応する状況をクリアしていません。 data_onlyを使用する場合、別のデータを使用する場合は? –

+0

ドキュメントには、さまざまなパラメータが明確に説明されています。ドキュメンテーションと相談せずに働いているようです。 –

+0

read_only:読み取りに最適化され、コンテンツは編集できません.data_onlyは、数式のセルに式(デフォルト)または最後にExcelがシートを読み取ったときに格納された値を持つかどうかを制御します。申し訳ありませんがなぜ公式に私のケースでdata_onlyを使用するのか分かりません。 –

関連する問題