Python

【Python】excelとcsvの変換方法【pandas:openpyxl:read_csv:to_csv】

当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

PythonでExcelファイルとCSVファイルを相互に変換したいと考えている方は多いのではないでしょうか。データ分析や業務効率化において、異なるファイル形式間でのデータ変換は頻繁に必要となります。

ExcelファイルはMicrosoft Excelで扱いやすく、複数シートや書式設定が可能ですが、CSVファイルはシンプルで軽量、多くのシステムで互換性が高いという特徴があります。それぞれの形式には利点があるため、状況に応じて使い分けることが重要です。

本記事では、Pythonのpandasライブラリとopenpyxlライブラリを活用したExcelとCSVの変換方法について詳しく解説していきます。read_csvやto_csv、read_excelやto_excelといった基本的なメソッドから、複数シートの処理や書式保持まで、実践的なコードとともに紹介します。

初心者の方でも理解できるよう、インストール方法から丁寧に説明していきますので、ぜひ最後までご覧ください。

PythonでExcelとCSVを変換する基本方法

それではまず、PythonでExcelとCSVを変換する基本的な方法について解説していきます。

pandasを使った変換の概要

Pythonでファイル形式を変換する際、最も広く使われているのがpandasライブラリです。pandasはデータ分析に特化したライブラリで、ExcelやCSVといった様々な形式のファイルを簡単に読み書きできます。

pandasの最大の魅力は、わずか数行のコードでファイル変換が完了する点にあります。DataFrameという表形式のデータ構造を介して、形式を問わず統一的に扱えるのです。

ExcelからCSVへ変換する場合は「read_excel → to_csv」、CSVからExcelへ変換する場合は「read_csv → to_excel」という流れになります。この2ステップの処理を理解すれば、基本的な変換操作はマスターできるでしょう。

pandasはNumPyをベースに構築されており、大量のデータでも高速に処理できる設計になっています。

必要なライブラリのインストール

ファイル変換を行う前に、必要なライブラリをインストールしましょう。コマンドプロンプトやターミナルで以下のコマンドを実行してください。

pip install pandas openpyxl

pandasはデータ処理の中核となるライブラリで、openpyxlはExcelファイルの読み書きに必要なエンジンです。pandas単体ではExcelファイルを扱えないため、openpyxlを併用する必要があります。

既にインストール済みかどうか確認したい場合は、Pythonインタプリタで次のように実行してみてください。

import pandas as pd
import openpyxl
print(pd.__version__)
print(openpyxl.__version__)

バージョン番号が表示されれば、正常にインストールされています。エラーが出る場合は、改めてpipコマンドでインストールしましょう。

基本的な変換フロー

ファイル変換の基本的な流れは以下のようになります。

ステップ 処理内容 使用メソッド
1. 読み込み 元ファイルをDataFrameに変換 read_csv / read_excel
2. 処理(任意) データの加工や整形 各種pandas操作
3. 出力 DataFrameを目的の形式で保存 to_csv / to_excel

この3ステップを理解しておけば、どんな変換パターンにも対応できます。読み込みと出力の組み合わせを変えるだけで、CSV→Excel、Excel→CSV、さらにはJSON→Excelなど、様々な形式間の変換が可能になるのです。

DataFrameは表形式のデータを扱うための強力なデータ構造で、行と列を持つ2次元配列のような構造です。このDataFrameを介することで、ファイル形式に依存しない統一的なデータ操作が実現できます。

CSVからExcelへの変換方法

続いては、CSVファイルをExcelファイルに変換する具体的な方法を確認していきます。

read_csvでCSVを読み込む

まずはCSVファイルをpandasで読み込む方法から見ていきましょう。read_csvメソッドを使用します。

import pandas as pd

df = pd.read_csv('data.csv', encoding='utf-8')
print(df.head())

encodingパラメータは文字化けを防ぐために重要です。日本語が含まれるCSVの場合、「utf-8」または「shift_jis」「cp932」などを指定します。どのエンコーディングか不明な場合は、試行錯誤が必要になることもあるでしょう。

その他の便利なパラメータとして、以下のようなものがあります。

df = pd.read_csv(
    'data.csv',
    encoding='utf-8',
    header=0,           # ヘッダー行の位置
    index_col=0,        # インデックスにする列
    sep=',',            # 区切り文字(デフォルトはカンマ)
    na_values=['NA', 'null']  # 欠損値として扱う文字列
)

区切り文字がタブの場合は「sep=’\t’」、セミコロンの場合は「sep=’;’」と指定できます。

to_excelでExcelファイルに出力

読み込んだDataFrameをExcelファイルとして保存するには、to_excelメソッドを使用します。

import pandas as pd

df = pd.read_csv('data.csv', encoding='utf-8')
df.to_excel('output.xlsx', index=False, sheet_name='データ')

index=Falseを指定すると、DataFrameのインデックス(行番号)がExcelに出力されなくなります。多くの場合、インデックスは不要なので、このパラメータを設定するのがおすすめです。

sheet_nameパラメータではシート名を指定できます。省略した場合は「Sheet1」という名前になります。日本語のシート名も問題なく使用可能です。

エンジンを明示的に指定したい場合は、以下のように記述します。

df.to_excel('output.xlsx', index=False, engine='openpyxl')

複数シートへの書き込み

1つのExcelファイルに複数のシートを作成することもできます。ExcelWriterを使用した方法を見てみましょう。

import pandas as pd

df1 = pd.read_csv('sales_2023.csv', encoding='utf-8')
df2 = pd.read_csv('sales_2024.csv', encoding='utf-8')

with pd.ExcelWriter('sales_report.xlsx', engine='openpyxl') as writer:
    df1.to_excel(writer, sheet_name='2023年', index=False)
    df2.to_excel(writer, sheet_name='2024年', index=False)

ExcelWriterを使うことで、複数のCSVファイルを1つのExcelファイルにまとめることができます。年度別や部門別のデータを整理する際に便利でしょう。

with文を使用することで、ファイルの書き込み後に自動的にクローズされるため、リソース管理の観点からも推奨される書き方です。

ExcelからCSVへの変換方法

続いては、Excelファイルをデータとして読み込み、CSVファイルに変換する方法を確認していきます。

read_excelでExcelを読み込む

Excelファイルを読み込むには、read_excelメソッドを使用します。基本的な使い方は以下の通りです。

import pandas as pd

df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
print(df.head())

sheet_nameパラメータで読み込むシートを指定できます。シート名だけでなく、インデックス番号(0から始まる)でも指定可能です。

df = pd.read_excel('data.xlsx', sheet_name=0)  # 最初のシート

複数の列を読み込みたくない場合は、usecols パラメータで必要な列だけを指定することもできます。

df = pd.read_excel(
    'data.xlsx',
    sheet_name='売上データ',
    header=0,
    usecols='A:D',     # A列からD列まで
    skiprows=[1, 2]    # 1行目と2行目をスキップ
)

大きなExcelファイルを扱う際は、必要な部分だけを読み込むことで処理速度が向上します。

to_csvでCSVファイルに出力

読み込んだDataFrameをCSVファイルとして保存するには、to_csvメソッドを使用します。

import pandas as pd

df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_csv('output.csv', index=False, encoding='utf-8-sig')

encoding=’utf-8-sig’を指定すると、BOM付きUTF-8で保存されます。これにより、ExcelでCSVファイルを開いた際の文字化けを防げます。

その他の便利なパラメータをいくつか紹介します。

パラメータ 説明 使用例
sep 区切り文字の指定 sep=’\t’(タブ区切り)
header ヘッダー行の出力有無 header=False
columns 出力する列の指定 columns=[‘名前’, ‘年齢’]
na_rep 欠損値の表現 na_rep=”(空文字)

特定の列だけをCSVに出力したい場合は、以下のように記述します。

df.to_csv('output.csv', columns=['氏名', '売上'], index=False, encoding='utf-8-sig')

特定シートの指定と複数シート処理

Excelファイルには複数のシートが含まれることが多いでしょう。全シートを一度に読み込む方法を見てみましょう。

import pandas as pd

all_sheets = pd.read_excel('data.xlsx', sheet_name=None)

for sheet_name, df in all_sheets.items():
    output_file = f'{sheet_name}.csv'
    df.to_csv(output_file, index=False, encoding='utf-8-sig')
    print(f'{output_file}を作成しました')

sheet_name=Noneを指定すると、全シートが辞書形式で返されます。キーがシート名、値がDataFrameとなっているため、for文で順に処理できるのです。

特定の複数シートだけを処理したい場合は、リストで指定します。

sheets = pd.read_excel('data.xlsx', sheet_name=['売上', '経費', '利益'])

for sheet_name, df in sheets.items():
    df.to_csv(f'{sheet_name}.csv', index=False, encoding='utf-8-sig')

この方法を使えば、月次レポートのような複数シートを持つExcelファイルを、シートごとに個別のCSVファイルに分割できます。

openpyxlを使った高度な変換テクニック

続いては、openpyxlライブラリを直接使用した、より高度な変換テクニックを確認していきます。

セルの書式を保持した変換

pandasの標準機能では、Excelの書式(フォントや色、罫線など)は保持されません。書式を保持したまま処理したい場合は、openpyxlを直接使用する必要があります。

from openpyxl import load_workbook
import pandas as pd

wb = load_workbook('formatted_data.xlsx')
ws = wb['Sheet1']

data = []
for row in ws.iter_rows(min_row=2, values_only=True):
    data.append(row)

df = pd.DataFrame(data, columns=['名前', '年齢', '部署'])
df.to_csv('output.csv', index=False, encoding='utf-8-sig')

wb.close()

この方法では、values_only=Trueで値のみを取得しているため、書式情報は失われます。書式を完全に保持したい場合は、openpyxlで直接Excelファイルを操作し、別のExcelファイルとして保存する必要があるでしょう。

セルの背景色やフォント情報にアクセスする例も見てみましょう。

from openpyxl import load_workbook

wb = load_workbook('formatted_data.xlsx')
ws = wb['Sheet1']

for row in ws.iter_rows(min_row=1, max_row=10):
    for cell in row:
        print(f'セル{cell.coordinate}: 値={cell.value}, 色={cell.fill.start_color.index}')

wb.close()

数式の取り扱い

Excelファイルに数式が含まれている場合、その扱いに注意が必要です。pandasのread_excelは、デフォルトで数式の計算結果を読み込みますが、数式自体を取得したい場合もあるでしょう。

数式そのものを取得するには、openpyxlを使用します。

from openpyxl import load_workbook

wb = load_workbook('formulas.xlsx')
ws = wb['Sheet1']

for row in ws.iter_rows(min_row=1, max_row=5):
    for cell in row:
        if cell.value and isinstance(cell.value, str) and cell.value.startswith('='):
            print(f'セル{cell.coordinate}の数式: {cell.value}')
        else:
            print(f'セル{cell.coordinate}の値: {cell.value}')

wb.close()

CSVファイルは数式をサポートしていないため、Excelの数式をCSVに変換する場合は、計算結果の値として保存されることを理解しておきましょう。

数式を含むExcelファイルをCSVに変換すると、数式は失われ、計算結果の値のみが保存されます。元のExcelファイルは必ずバックアップを取っておくことをおすすめします。

画像やチャートの扱い

Excelファイルにはグラフや画像が含まれることもありますが、CSVファイルはテキストデータのみをサポートしているため、これらの要素は変換時に失われます。

画像を抽出したい場合は、openpyxlで個別に処理する必要があります。

from openpyxl import load_workbook
from openpyxl.drawing.image import Image
import os

wb = load_workbook('with_images.xlsx')
ws = wb['Sheet1']

if not os.path.exists('extracted_images'):
    os.makedirs('extracted_images')

for image in ws._images:
    image_filename = f'extracted_images/{image.anchor._from.col}_{image.anchor._from.row}.png'
    with open(image_filename, 'wb') as f:
        f.write(image._data())
    print(f'{image_filename}を保存しました')

wb.close()

グラフについても同様で、CSV形式では表現できないため、データ部分のみを抽出することになります。グラフの元データを取得したい場合は、グラフが参照しているセル範囲のデータを読み込む方法が有効でしょう。

実務では、画像やグラフを含むExcelファイルを変換する際は、元のExcelファイルを保持し、CSVは純粋なデータファイルとして扱うのが一般的です。

まとめ

PythonでExcelとCSVを変換する方法について、pandasとopenpyxlを使った様々なテクニックを解説してきました。

基本的な変換は、read_csvとto_excel、read_excelとto_csvの組み合わせで実現できます。わずか数行のコードで、ファイル形式の変換が完了するのがpandasの魅力です。encodingパラメータやindex、sheet_nameなどの設定を適切に行うことで、実務でも十分に使える変換処理が構築できるでしょう。

複数シートの処理やExcelWriterを使った統合、特定の列だけを抽出するなど、状況に応じた柔軟な対応も可能です。大量のファイルを一括処理する際は、for文と組み合わせることで自動化できます。

一方で、Excelの書式や数式、画像といった高度な要素を扱う場合は、openpyxlを直接使用する必要があります。CSVはシンプルなテキスト形式であるため、これらの要素は変換時に失われることを理解しておきましょう。

ExcelとCSVにはそれぞれ特徴があり、用途に応じて使い分けることが重要です。Pythonを使えば、両者の利点を活かしながら、効率的なデータ処理が実現できます。本記事で紹介したコードを参考に、ぜひ実際の業務で活用してみてください。