HOWTO · Python
Python で配列を CSV ファイルに書き込む
このチュートリアルでは、Python で配列を CSV ファイルに保存する方法を示します
このページの内容
CSV(comma-separated values)は表形式のデータをテキストの行として保存するため、加工済みの配列をスプレッドシートやほかのプログラムと共有するのに便利です。配列の形を保ったデータには NumPy、すでに DataFrame を使っている場合は Pandas、一般的な行データや確実な引用処理には Python の csv モジュールを選べます。以下の例ではカンマを区切り文字として使い、保存した行を読み取る方法も説明します。
numpy.savetxt() で NumPy 配列を CSV に書き込む
numpy.savetxt() は、1次元または2次元の配列をテキストファイルに書き込みます。列をカンマで区切るには delimiter="," を渡します。既定の区切り文字は空白なので、そのままではカンマ区切りの列になりません。1次元の数値配列で整数表記が適切なら、np.savetxt("numbers.csv", data, delimiter=",", fmt="%d") を使います。小数値では "%.2f" のような書式を指定し、表示する精度を調整できます。
文字列と数値を含む表形式のデータでは、たとえば np.array([["Name", "Age"], ["Ada", 36]]) のような2次元配列を作り、fmt="%s" を指定します。NumPy 配列の要素型は1種類なので、文字列と数値を組み合わせると値は文字列になり、この書式でテキストとして書き込まれます。CSV 自体は Python や NumPy の型を保持しません。読み込んだ値 36 を整数として使う必要があれば、読み込み側のプログラムで型を解釈してください。
NumPy は配列の各行を CSV の1行として書き込みます。header を指定しない限り列名は追加されず、ヘッダーを指定した場合も既定では先頭にコメント記号が付きます。列名を通常の先頭行として書くには、header="Name,Age" と comments="" を指定します。
Pandas の DataFrame.to_csv() で配列を CSV に書き込む
列に名前を付けたい場合や、すでに Pandas を使っている場合は、配列形式のデータを Pandas の DataFrame に変換します。たとえば df = pd.DataFrame(data, columns=["Name", "Age"]) とすると値に列名が付き、df.to_csv("people.csv", index=False) で書き込めます。index=False を指定すると、行ラベルが余分な先頭列として追加されません。行ラベルもファイルに含める場合に限り、この指定を省略してください。列名を含めない場合は header=False を指定します。ほかのエクスポートオプションについては DataFrame.to_csv() のリファレンスを参照してください。
Python の csv.writer() で行を CSV に書き込む
Python 標準ライブラリの csv.writer() は、文字列、数値、カンマ、引用符を含む行を扱う場合に適しています。ファイルを newline="" で開いて writer を作成し、行を writerows() に渡します。値にカンマや引用符が含まれていても、writer が CSV の引用符処理を行います。この例は標準ライブラリだけを使い、行と区切り文字の動作を確認できるよう保存したファイルの内容を表示します。
この例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
path = Path(directory) / "numbers.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(rows)
print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2
入力が大きい場合、writerows() には行の iterable を渡せるため、データ全体を別のリストにまとめる必要はありません。with ブロックが終わるとファイルは閉じられます。
csv.reader() で CSV ファイルを読み戻す
csv.reader() はファイルを読み込み、各行を文字列のリストとして返します。これは reader であり、writer オブジェクトではありません。たとえば 36 として書き込んだセルは文字列の "36" として読み込まれます。数値演算が必要な場合は int() または float() で変換してください。CSV を読み込むテキストファイルも newline="" を指定して開きます。ファイルにヘッダーがある場合は、データ行を処理する前に next(reader) を呼び出すなどして、先頭行を別に扱います。reader は引用符で囲まれた区切り文字も解釈します。各行をカンマで分割する方法とは異なります。
Python のファイル操作で単純な行を書き込む
カンマ、引用符、改行を含まない単純で管理された値なら、ファイルを直接操作する方法でも十分です。各値をテキストに変換し、行の値をカンマで連結して、最後に改行を付けます。たとえば file.write(",".join(map(str, row)) + "\n") のように書けます。ただし、これは手動のテキスト整形であり、汎用的な CSV シリアライザーではありません。たとえば "Doe, Jane" という名前は2列に分割されてしまいます。任意のデータには csv.writer() を使うと、引用符と区切り文字を適切に処理できます。CSV 出力用にファイルを開くときは newline="" を指定し、非 ASCII 文字を含むファイルでは UTF-8 などの明示的なエンコーディングを選びます。