HOWTO · Pandas

Pandas で GZ ファイルを読み取る

この記事では、Pandas という名前の Python ライブラリを使用して gz ファイルを読み取る方法を示します。

このページの内容

pandas.read_csv() を使うと、gzip圧縮されたCSVファイルを直接 DataFrame に読み込めます。.csv.gz のパスを渡し、必要に応じて compression="gzip" を指定します。pandas はCSVの内容を解析しながらファイルを展開します。以下の例では小さなローカルファイルを作成するため、データセットをダウンロードせずに試せます。自分のファイルに合わせるときは、一時ファイルのパスを実際のパスに置き換えてください。

pandasでgzip圧縮されたCSVを読み込む

.gz はgzip圧縮を示す拡張子であり、中身のデータ形式を示すものではありません。gzipアーカイブにはCSVテキストが含まれることもあれば、別の形式のデータが含まれることもあります。展開後の内容がカンマ区切りテキストなら、read_csv を使います。一般的なケースでは、pandas は .gz 拡張子から圧縮形式を推定できます。compression="gzip" を指定すると、圧縮形式を明示できます。パスやファイルオブジェクトから圧縮形式を判別できない場合に便利です。

次の例を実行してください。

このセクションのコードと表示されるラベルや出力は英語のままです。

import gzip
import tempfile
from pathlib import Path

import pandas as pd

with tempfile.TemporaryDirectory() as directory:
    csv_gz_path = Path(directory) / "sales.csv.gz"
    with gzip.open(csv_gz_path, "wt", encoding="utf-8", newline="") as file:
        file.write("item,quantity\nnotebook,3\npen,8\n")

    sales = pd.read_csv(csv_gz_path, compression="gzip")
    print(sales.head())

ファイルは一時ディレクトリに作成され、同じ実行中に read_csv から読み込めます。この例ではgzipストリーム内にUTF-8テキストを格納し、CSVにはヘッダー行と2件のレコードを含めています。コード例の列名 item と quantity は英語のままです。既存のファイルを使う場合は、読み込み処理はそのままにして、csv_gz_path を実際のパスに置き換えてください。

ファイルに合わせて read_csv を設定する

read_csv はpandasの DataFrame を返します。既定では、CSVのヘッダーが列名になります。この例の compression="gzip" は入力を展開する形式を指定していますが、ファイル名の .gz からpandasがgzip形式を推定できる場合は省略できます。区切り文字の既定値はカンマなので、通常は sep="," も不要です。タブ区切りのファイルでは、代わりに sep="\t" を使います。

既定の header="infer" は先頭行を列名として扱います。このファイルでは header=0 と同じです。ヘッダー行がないファイルでは header=None を使い、列名を指定したい場合は names=[...] を渡します。CSV解析に使う引用符の既定値は quotechar='"' です。引用符で囲まれたフィールドにはカンマを含めても別の列に分割されません。ファイルの引用符の規則が異なる場合にだけ quotechar を変更してください。

パスは、絶対パスでない限り、プロセスの現在の作業ディレクトリを基準に解釈されます。例のように入力パスとして Path オブジェクトを使えます。文字列のパスも使用できます。Windowsのパスには r"C:\data\sales.csv.gz" のようなraw文字列を使うか、pathlib でパスを組み立てると、バックスラッシュのエスケープに関する問題を避けられます。

読み込んだDataFrameを確認して使う

変数 sales は DataFrame なので、列を選択したり、行を絞り込んだり、ほかのpandas処理に渡したりできます。sales.head() は既定で先頭5行を返し、sales.head(10) は10行を指定します。ヘッダーが列名になっているか、値が想定どおりの列に分かれているかをすばやく確認できます。解析された列名と型の概要を見るには、sales.columns と sales.dtypes を確認します。

表示される行は、読み込むファイルとpandasの表示設定によって異なります。実際のデータセットを説明するときは、出力を選択可能なテキストとして掲載してください。また、大きなファイルのプレビューだけで全行を検証できたと判断しないでください。

形式やパスの問題に対処する

Pythonがファイルを見つけられないと報告した場合は、名前の綴りや大文字・小文字、ディレクトリを確認し、相対パスなら現在の作業ディレクトリも確認してください。ファイルオブジェクトを使う場合や、名前に .gz が含まれない場合でも、データがgzip圧縮されているなら compression="gzip" を明示します。pandasが展開エラーを報告した場合は、そのファイルが本当にgzipデータか、途中で切れていないかを確認してください。

展開は成功してもCSVの解析に失敗する、または列が正しく見えない場合は、展開後の内容を調べ、内容に合った解析オプションを指定してください。よくある原因は、gzip圧縮されているもののCSVではない形式に read_csv を使っていること、区切り文字の指定が違うこと、ヘッダーのないファイルの先頭データ行を列名として扱っていることです。引用符で囲まれたフィールドには区切り文字が含まれることがあります。quotechar を適切に指定すれば、その値を1つのフィールドとして扱えます。gzipが行うのは圧縮だけです。別のファイル形式をCSVに変換するものではありません。