2017-11-23 3 views
1

私はBIG excelファイル(xlsx)から10行だけを読み込み、ファイル全体を一度に読み込まないでください。マシン(低メモリ)。 私はLoadingファイル全体をメモリにロードするのではなく、チャンクでPythonでファイルを読み込みます。

import xlrd 
import pandas as pd 
def open_file(path): 
    xl = pd.ExcelFile(path) 
    reader = xl.parse(chunksize=1000) 
    for chunk in reader: 
     print(chunk) 

を使用してみましたが、ファイルが吸うの部分に分け、最初にロードされるように思えます。 最初の行だけを読む方法に関するアドバイスに感謝します。 さらに詳しい情報が必要な場合は、コメントを残してください。しかし、すべてがクリアであるはずです。ありがとう!

+0

あなたは明らかにパンダを使用していますが、指定していない - 完全なコードを表示していますか? – Barnabus

+1

厳密にはパンダを守っているわけではありませんが、私の助言は、自動的にコア計算から抜け出し、速いSFrameを使うことです。 'pip install --U sframe'を使用してインストールしてください。 –

+0

Barnabusより多くのコードを表示する必要はありません。私はちょうどn行だけをロードしたい。 編集: @VivekKalyanarangan回答ありがとうございます。確認してみるよ。 – Kornel

答えて

1

本質的にxmlファイルの束のため、任意のバイトでファイルをポックすることはできません。そのファイルは、ファイル内のテーブルのN番目の行の先頭になることを願っています。シートに興味があります。

あなたができる最善のはskiprowspandas.read_excelを使用している(ファイルの先頭からの行をスキップ)とskip_footer引数(下から行をスキップします)。ただし、ファイル全体を最初にメモリにロードしてから、必要な行だけを解析します。あなたはnames引数を指定して手動でヘッダーを設定する必要が

# if the file contains 300 rows, this will read the middle 100 
df = pd.read_excel('/path/excel.xlsx', skiprows=100, skip_footer=100, 
        names=['col_a', 'col_b']) 

注意それ以外の列名は、最後の行がスキップされます。

csvを代わりに使用する場合は、csvファイルがプレーンテキストファイルであるため、簡単な作業です。

しかし、それはあなたが本当に必死であれば、あなたがxlsxアーカイブから関連するシートのxmlファイルを抽出し、それを解析することができ、大きなしかしです。しかし、それは簡単な作業になることはありません。

xmlファイルは、1つの2 X 3テーブルがあるシートを表すファイルです。 <v>タグはセルの値を表します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"> 
    <dimension ref="A1:B3"/> 
    <sheetViews> 
     <sheetView tabSelected="1" workbookViewId="0"> 
      <selection activeCell="C10" sqref="C10"/> 
     </sheetView> 
    </sheetViews> 
    <sheetFormatPr defaultColWidth="11" defaultRowHeight="14.25" x14ac:dyDescent="0.2"/> 
    <sheetData> 
     <row r="1" spans="1:2" ht="15.75" x14ac:dyDescent="0.2"> 
      <c r="A1" t="s"> 
       <v>1</v> 
      </c><c r="B1" s="1" t="s"> 
       <v>0</v> 
      </c> 
     </row> 
     <row r="2" spans="1:2" ht="15" x14ac:dyDescent="0.2"> 
      <c r="A2" s="2"> 
       <v>1</v> 
      </c><c r="B2" s="2"> 
       <v>4</v> 
      </c> 
     </row> 
     <row r="3" spans="1:2" ht="15" x14ac:dyDescent="0.2"> 
      <c r="A3" s="2"> 
       <v>2</v> 
      </c><c r="B3" s="2"> 
       <v>5</v> 
      </c> 
     </row> 
    </sheetData> 
    <pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/> 
</worksheet> 
+0

問題は、ファイル全体をロードしてから、それをチャンクに分割することです。回答ありがとうございますが、それは私が探しているものでもありません。 – Kornel

+1

@Kornel私の更新答えを見て、私はいくつかの情報を追加しました。 – DeepSpace

+0

あなたの答えに感謝します。知っておく価値のある情報の素晴らしい束。私はこれを私の質問への答えとしてマークします。 – Kornel

関連する問題