PythonでExcelをCSVに書き出す方法

今回は Excelファイルを CSVに書く出す方法について解説します。

PythonでExcelをCSVに書き出す方法

Excelでゲームデータを管理するときの問題点

敵のパラメータを管理する場合、表計算ソフトである “Excel” を使用すると楽に管理ができます。例えば敵のパラメータのデータを以下のように定義するとします。

Excelデータは通常「.xlsx」で保存しますが、このデータはバイナリデータであるため実行環境(ゲームエンジンなど)で解析するのは少し大変なので、通常は「.csv」などのテキストファイルに変換した上で扱うこととなります。

ここで問題となるのが、書き出しを行うたびに「エクスポート」の操作を行う手間が発生することです。

できることなら変更した後は簡単に CSV に書き出せるようにしたいので、Pythonを使って書き出せるようにします。

Pythonから Excelのデータを書き出す

openpyxlのインストール

Pythonがインストール済みであれば、”openpyxl” というライブラリを使用することで簡単に CSV への書き出しができます。

“openpyxl” のインストールは以下のコマンドでインストールできます。

コマンドプロンプト
pip install openpyxl

CSV書き出しのスクリプト

早速ですが、CSV書き出しのスクリプトは以下のものとなります。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# ===============================================
# xlsxをcsvに出力するツール
# ------------------------------------------
# openpyxl を使用するには以下のコマンドを使います
# >pip install openpyxl
# ===============================================
import openpyxl
import sys

def usage() -> None:
    print("usage:")
    print(" xlsx_to_csv.py [.xlsx] [.csv]")

def main() -> None:
    argv = sys.argv
    # テスト用の引数
    #argv = ["", "enemy.xlsx", "enemy.csv"]    

    if len(argv) < 3:
        usage()
        return
    
    xlsx_path = argv[1]
    csv_path = argv[2]

    # 読み取り専用でExcelを開く.
    wb = openpyxl.load_workbook(filename=xlsx_path, read_only=True, data_only=True)
    # シートオブジェクトを取得.
    sheet = wb["Sheet1"]

    tmp = ""
    for i in range(sheet.max_row):
        row = i + 1 # Excelは1始まり
        v = sheet.cell(row, 1).value
        if v is None:
            break # 最初の列が空欄であれば終了とする

        for j in range(sheet.max_column):
            col = j + 1 # Excelは1始まり.
            v = sheet.cell(row, col).value
            if v is None:
                v = "" # 空欄の場合は空文字にしておきます
            if j > 0:
                tmp += "," # 1列目でなければカンマを入れる
            tmp += str(v) # 文字列にします
        tmp += "\n" # 改行
    print(tmp)

    # xlsxを閉じる.
    wb.close()

    # CSVに書き込む.
    csv = open(csv_path, "w")
    csv.write(tmp)
    csv.close()

if __name__ == "__main__":
    main()

簡単に説明すると openpyxl.load_workbook() で Excelファイルを読み込みます。読み込みに成功するとWorkBookオブジェクトを返すので、そこからWorkSheetオブジェクトを取り出します。

WorkSheetオブジェクトには cell() という関数が用意されているので、それを使ってセルのデータを取り出します。なお空欄の場合は None となるため、それをデータの終端として判定できます。

このスクリプトはコマンドプロンプトから以下のようにして呼び出します。

コマンドプロンプト
python xlsx_to_csv.py enemy.xlsx enemy.csv

完成スクリプトデータ

今回作成したスクリプトとサンプルデータを添付しておきます。

conv.bat” (バッチファイル) は Windows環境でのみ使用することができます。