0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python で Excelファイルを CSV に変換する方法

0
Posted at

Excel ファイル(.xlsx/.xls)を CSV 形式に変換する作業は、データ分析やシステム間のデータ連携において頻繁に発生します。データベースへのインポート、スクリプトによるバッチ処理、あるいは異なるアプリケーション間でのデータ受け渡しなど、CSV 形式が求められる場面は多岐にわたります。

Python を使ってこの変換を自動化することで、手作業によるミスを減らし、処理の効率を高めることが可能です。この記事では、Spire.XLS for Python というライブラリを用いた変換手順を、具体的なコード例とともに解説します。

Spire.XLS for Python の概要

Spire.XLS for Python は、Python 環境から Excel ファイルの読み込み、作成、編集、変換を行うためのライブラリです。.NET 向けに開発された Spire.XLS を Python から利用できるようにしたもので、以下のような操作が可能です。

  • Excel ワークブックの読み込みと新規作成
  • セルデータの読み取りと書き込み
  • 数式や書式の設定
  • グラフや画像の操作
  • PDF、CSV、HTML、画像などの各種形式への変換
  • Windows、Linux、macOS での動作

このライブラリには無料版と有料版があります。無料版ではシートあたりの行数や列数に上限が設けられています。大規模なファイルを扱う場合は、事前に公式の制限事項を確認する必要があります。

環境の準備

Spire.XLS for Python は PyPI に登録されており、以下のコマンドでインストールできます。

pip install Spire.XLS

インストールが完了したら、Python スクリプト内で必要なクラスをインポートして使用します。

from spire.xls import Workbook
from spire.xls import FileFormat

Excel を CSV に変換する基本手順

Spire.XLS for Python で Excel を CSV に変換する基本的な流れは次のとおりです。

  1. Workbook オブジェクトを作成し、Excel ファイルを読み込む
  2. SaveToFile メソッドでCSV形式を指定して保存する
  3. Dispose メソッドでリソースを解放する

ワークブックのアクティブシートをCSVに変換する

以下のコードは、Excel ファイルのアクティブシート(通常は先頭シート)を CSV として保存する例です。

from spire.xls import Workbook
from spire.xls import FileFormat

# Workbookオブジェクトの作成
workbook = Workbook()

# Excel ファイルの読み込み
workbook.LoadFromFile("data.xlsx")

# CSV 形式で保存(アクティブシートが対象)
workbook.SaveToFile("output.csv", FileFormat.CSV)

# リソースの解放
workbook.Dispose()

FileFormat.CSV は、ファイル形式を CSV として指定する列挙値です。このメソッドではアクティブシートのみが変換対象となります。

特定のワークシートをCSVに変換する

ワークブックに複数のシートが含まれており、特定のシートだけをCSVに変換したい場合は、Worksheet オブジェクトの SaveToFile メソッドを使用します。

from spire.xls import Workbook

workbook = Workbook()
workbook.LoadFromFile("data.xlsx")

# 2 番目のワークシートを取得(インデックスは0から)
worksheet = workbook.Worksheets[1]
worksheet.SaveToFile("sheet2.csv", ",")

workbook.Dispose()

Worksheet.SaveToFile メソッドの第2引数には、区切り文字を指定します。通常の CSV であればカンマ(,)、タブ区切りであればタブ文字(\t)を指定します。

すべてのワークシートを個別の CSV ファイルに変換する

ワークブック内の全シートを、それぞれ個別の CSV ファイルとして保存するには、以下のようにループ処理を行います。

from spire.xls import Workbook

workbook = Workbook()
workbook.LoadFromFile("data.xlsx")

# 全ワークシートをループ
for i in range(workbook.Worksheets.Count):
    worksheet = workbook.Worksheets[i]
    # シート名をファイル名に使用(ファイル名に使えない文字は置換)
    safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
    output_filename = f"{safe_name}.csv"
    worksheet.SaveToFile(output_filename, ",")

workbook.Dispose()

シート名にファイル名として使用できない文字(/\など)が含まれている場合を考慮し、置換処理を追加しています。環境によっては他の文字も置換対象となります。

CSV 変換時の留意点

区切り文字の指定

日本ではカンマ区切りの CSV が一般的ですが、データによってはタブ区切り(TSV)やセミコロン区切りが適している場合もあります。SaveToFile メソッドの第 2 引数で任意の区切り文字を指定できます。

# タブ区切りで保存
worksheet.SaveToFile("output.tsv", "\t")

出力される文字コード

SaveToFile メソッドで出力される CSV ファイルの文字コードは、既定では UTF-8(BOM なし)です。日本語環境で Microsoft Excel を使って CSV を開くと、文字化けが発生する場合があります。これは Excel が BOM なし UTF-8 を正しく判別できないことに起因します。

以下のように、出力後に文字コードを Shift-JIS に変換する後処理を行う方法があります。

# UTF-8 で出力後、Shift-JIS に変換する例
worksheet.SaveToFile("temp.csv", ",")

# UTF-8 で読み込み、Shift-JIS で書き出し
with open("temp.csv", "r", encoding="utf-8") as f:
    content = f.read()

with open("output_sjis.csv", "w", encoding="shift_jis") as f:
    f.write(content)

この方法はライブラリ自体の機能ではなく、Python の標準機能を併用したものです。出力された CSV ファイルの文字コードを要件に合わせて調整する必要がある場合は、このようなアプローチを検討します。

値にカンマや改行が含まれる場合の処理

CSV 形式では、セル内にカンマやダブルクォーテーション、改行が含まれる場合、適切にエスケープ処理が行われないとデータが崩れます。Spire.XLS for Python の SaveToFile メソッドは、セル値にカンマや改行が含まれる場合、自動的に値をダブルクォーテーションで囲み、ダブルクォーテーション自体は2重にエスケープする処理を行います。この動作はRFC 4180 などの CSV の標準的な慣行に沿ったものです。

無料版の制限

Spire.XLS for Python の無料版では、1シートあたりの変換可能な行数と列数に制限があります。公式ドキュメントによると、無料版は1シートあたり 200 行、30 列までのデータが対象です(バージョンによって異なる可能性があります)。この制限を超えるデータを扱う場合は、pandas など別のライブラリを使用するか、有料版の利用を検討することになります。

他のライブラリとの比較

Python で Excel を CSV に変換する方法は複数あります。主なものを以下に示します。

方法 特徴
pandas read_excelto_csv で変換可能。大規模データにも対応。データ分析用途で広く使われる。
openpyxl .xlsx ファイルの読み書きが可能。CSV 出力は csv モジュールと組み合わせて実装する必要がある。
xlrd 古い .xls 形式の読み取りに対応(バージョン 2.0 以降は .xlsx 非対応)。CSV 出力は別途実装が必要。
csv(標準ライブラリ) Python 標準。ファイル入出力と組み合わせて使用する。

Spire.XLS for Python は、.xls 形式と .xlsx 形式の両方に対応しており、単一の API で複数のフォーマットを扱えることが特徴です。また、CSV 出力時にエスケープ処理が自動で行われるため、自力での実装が不要です。一方で、無料版の行数・列数制限があるため、扱うデータの規模に応じて適切なライブラリを選択する必要があります。

実用的なユースケース

以下は、複数の Excel ファイルをまとめて CSV に変換するバッチ処理の例です。特定のディレクトリ内のすべての .xlsx ファイルを対象とします。

import os
from spire.xls import Workbook

target_dir = "./excel_files"
output_dir = "./csv_output"

# 出力先ディレクトリがなければ作成
os.makedirs(output_dir, exist_ok=True)

# ディレクトリ内の全 .xlsx ファイルを処理
for filename in os.listdir(target_dir):
    if filename.endswith(".xlsx"):
        workbook = Workbook()
        filepath = os.path.join(target_dir, filename)
        workbook.LoadFromFile(filepath)
        
        # 全シートを CSV に変換
        for i in range(workbook.Worksheets.Count):
            worksheet = workbook.Worksheets[i]
            safe_name = worksheet.Name.replace("/", "_").replace("\\", "_")
            output_filename = f"{os.path.splitext(filename)[0]}_{safe_name}.csv"
            output_path = os.path.join(output_dir, output_filename)
            worksheet.SaveToFile(output_path, ",")
        
        workbook.Dispose()

このスクリプトを定期的に実行することで、手動作業を介さずに Excel データを CSV 形式で収集できます。

まとめ

Spire.XLS for Python を使用すると、数行のコードで Excel ファイルを CSV に変換できます。複数シートの処理や区切り文字の指定にも対応しており、データ連携やバッチ処理の自動化に利用可能です。

導入にあたっては、無料版の行数・列数の制限や、出力される CSV の文字コードに関する仕様を事前に確認することが重要です。また、処理後は Dispose メソッドでリソースを解放することを推奨します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?