カテゴリー
アーカイブ

11.21
2025

Python で業務効率化:ファイル操作&CSV/Excel 入門

  • LINE

はじめに

「毎回同じ Excel を手で更新していてつらい」「ファイル名をちょっと変えるだけの単純作業に時間を取られている」——そんな経験はないでしょうか。
Python を使うと、こうした「単純だけど面倒な作業」の多くを自動化できます

この記事では、業務効率化の第一歩として、

  • Python での基本的なファイル操作
  • CSV ファイルの入出力
  • Excel ファイルの入出力
  • Excel アプリでそのまま開ける CSV を作るポイント

を、プログラミング/Python 初学者向けにサンプルコード付きで解説します。

 

想定読者

プログラミング/Python の初学者であり、「Python の環境構築と基本的な文法(変数・for 文・if 文・関数定義など)はわかる」レベルの方、そして日々の事務作業やデータ整理を少しでも効率化したい方を想定しています。この記事を読み終える頃には、「簡単な CSV・Excel 処理なら自分でスクリプトを書いて自動化できそう」と思ってもらえることを目指します。

 

基礎となる知識

まず、本題に入る前に本記事で扱うキーワードをざっくり整理しておきます。

ファイルパスとカレントディレクトリ

Python でファイルを扱うときは、「どのファイルを」「どこから見て」開くかが重要です。

  • 絶対パス: /Users/you/work/data.csv のように、ルートからの完全な場所を指定
  • 相対パス: ./data.csv../input/data.csv のように、スクリプトを実行した場所(カレントディレクトリ)からの位置で指定

初めのうちは、トラブルを減らすために以下のどちらかをおすすめします。

  • 実行するスクリプトと同じフォルダにファイルを置いて data.csv で指定する
  • 絶対パスを使う(ただし、環境依存になりやすい点には注意)

テキストファイルとバイナリファイル

ファイルには大きく分けて、

  • テキストファイル: csv, txt, json など、人間が読める文字列で構成される
  • バイナリファイル: xlsx, png, pdf など、専用アプリで開く前提のもの

があります。

Python で開くとき、open() 関数の第 2 引数に

  • "r" / "w" / "a" … テキストモード(文字として扱う)
  • "rb" / "wb" … バイナリモード(バイト列として扱う)

と指定します。本記事で扱う CSV はテキスト、Excel (.xlsx) はバイナリモードで扱うイメージを持っておくと良いです。

CSV と Excel(xlsx)の違い

CSV: "Comma Separated Values" の略。1 行が 1 レコード、カンマ区切りで値を並べた テキストファイル

  • メモ帳で開いても中身が見える
  • ほぼすべての表計算ソフトが読める

Excel(.xlsx): Microsoft Excel 独自のファイル形式

  • シートが複数ある
  • セルのスタイルや数式などの情報も持てる

業務では「とりあえず Excel で開ければ良い」ケースが多いため、

  • 軽量に扱いたい → CSV
  • 複雑なシートや数式も含めて扱いたい → Excel(.xlsx)

という使い分けができるようになると便利です。

 

Python でファイルを読み込むには?

まずは、もっとも基本的な「ファイルの読み書き」から始めます。

テキストファイルの読み込み

# sample_read.py
from pathlib import Path

file_path = Path("input.txt")

# ファイル全体を一気に読み込む例
with file_path.open("r", encoding="utf-8") as f:
  text = f.read()

print("読み込んだ内容:")
print(text)

ポイント:

  • with 文を使うと、処理が終わったタイミングで自動的にファイルが閉じられます。
  • encoding="utf-8" を明示することで、文字化けトラブルを減らせます。

テキストファイルへの書き込み

# sample_write.py
from pathlib import Path

file_path = Path("output.txt")
text = "こんにちは、Pythonでファイルを書き込みます。"

with file_path.open("w", encoding="utf-8") as f:
  f.write(text)

print(f"{file_path} に書き込みました。")
  • "w" モードは上書きです。既存ファイルの中身は消えるので注意してください。
  • 追記したい場合は "a" モードを使います。

 

CSV の入出力

ここから、業務でよく登場する CSV ファイルを扱ってみます。Python 標準ライブラリの csv モジュールを使うのが基本です。

CSV を読み込む(リストとして扱う)

# read_csv_basic.py
import csv
from pathlib import Path

file_path = Path("employees.csv")

rows = []
with file_path.open("r", encoding="utf-8", newline="") as f:
  reader = csv.reader(f)
  for row in reader:
    rows.append(row)

for row in rows:
  print(row)
  • csv.reader は、1 行ごとにリスト(["山田太郎", "営業部", "500000"] のような形)を返します。
  • newline="" を指定するのは、改行コードの扱いで余計な空行が入るのを防ぐための「お作法」です。

ヘッダー付き CSV を辞書として読み込む

業務データには「1 列目が名前、2 列目が部署、3 列目が給与…」のように列名(ヘッダー)が付いていることが多いです。その場合は csv.DictReader を使うと便利です。

# read_csv_dict.py
import csv
from pathlib import Path

file_path = Path("employees.csv")

with file_path.open("r", encoding="utf-8", newline="") as f:
  reader = csv.DictReader(f)
  for row in reader:
    # row は {"name": "...", "department": "..."} のような dict
    print(row["name"], "は", row["department"], "所属です")
  • 列名でアクセスできるので、列の順番が変わってもコードが壊れにくくなります。

CSV に書き出す(Excel で読みやすい形式)

# write_csv_basic.py
import csv
from pathlib import Path

file_path = Path("output_employees.csv")

rows = [
  ["name", "department", "salary"],
  ["山田太郎", "営業部", 500000],
  ["佐藤花子", "開発部", 600000],
]

with file_path.open("w", encoding="utf-8", newline="") as f:
  writer = csv.writer(f)
  writer.writerows(rows)

print(f"{file_path} を出力しました。")
  • writerow は 1 行、writerows は複数行をまとめて書き込むメソッドです。
  • 数値(int / float)もそのまま渡せます。CSV 内では文字列として保存されます。

 

Excel の入出力

次に、拡張子が .xlsx の Excel ファイルを扱ってみます。ここでは比較的扱いやすい openpyxl ライブラリを使います。

ライブラリのインストール

ターミナルで次のコマンドを実行します。

pip install openpyxl

パッケージのインストール例には pip を用いていますが、uv など別のパッケージ管理ツールを使っている場合は、適宜コマンドを読みかえてください。

Excel ファイルを新規作成して書き込む

# write_excel_basic.py
from pathlib import Path

from openpyxl import Workbook

output_path = Path("report.xlsx")

wb = Workbook()
ws = wb.active # 最初のシート
ws.title = "売上レポート"

# ヘッダー行
ws["A1"] = "商品名"
ws["B1"] = "数量"
ws["C1"] = "金額"

# データ行
data = [
  ("りんご", 10, 3000),
  ("バナナ", 5, 1000),
  ("みかん", 8, 2400),
]

for row_index, (name, qty, total) in enumerate(data, start=2):
  ws[f"A{row_index}"] = name
  ws[f"B{row_index}"] = qty
  ws[f"C{row_index}"] = total

wb.save(output_path)
print(f"{output_path} を出力しました。")
  • Workbook() で新しい Excel ファイルを作成します。
  • セル指定は "A1" のような文字列でも、cell(row=1, column=1) のような数値指定でも可能です。

既存の Excel ファイルを読み込む

# read_excel_basic.py
from pathlib import Path

from openpyxl import load_workbook

file_path = Path("report.xlsx")

wb = load_workbook(file_path, data_only=True)
ws = wb["売上レポート"]

for row in ws.iter_rows(min_row=2, values_only=True):
  name, qty, total = row
  print(name, qty, total)
  • data_only=True を指定すると、数式セルは計算結果の値として読み込まれます(Excel で一度保存されている必要があります)。
  • iter_rowsvalues_only=True を付けると、セルオブジェクトではなく値そのものが取れるのでシンプルです。

 

Excel アプリで読み込める CSV の作成

「Excel で開ける CSV を作ったはずなのに、文字化けする」「日付が勝手に変な形式になる」などのトラブルはありがちです。ここでは、Excel での利用を意識した CSV 作成のポイントを押さえておきます。

エンコーディング(文字コード)問題

Windows の Excel で日本語 CSV を開く場合、

  • 伝統的には Shift_JIS(厳密には CP932)が多い
  • 最近の Excel では「UTF-8(BOM 付き)」も扱えるようになってきている

など、環境によって事情が異なります。

一方で、Python 側で UTF-8(BOM 付き) の CSV を読むときは、encoding="utf-8" ではなく encoding="utf-8-sig" を指定すると、先頭の BOM を自動で無視してくれます。

シンプルに UTF-8 で出力する例

最近の Excel では、UTF-8(BOM 付き) の CSV であればそのまま文字化けせずに開けることが多いです。社内の環境で「UTF-8 で問題なく開ける」ことが確認できているなら、まずはこれで十分です。

# write_csv_for_excel_utf8.py
import csv
from pathlib import Path

file_path = Path("excel_friendly_utf8.csv")

rows = [
  ["日付", "取引先", "金額"],
  ["2025-11-21", "株式会社サンプル", 100000],
  ["2025-11-22", "テスト商事", 50000],
]

with file_path.open("w", encoding="utf-8", newline="") as f:
  writer = csv.writer(f)
  writer.writerows(rows)

print(f"{file_path} を UTF-8 で出力しました。")

Python の標準ライブラリだけで UTF-8(BOM 付き) で出力したい場合は、先頭に BOM を自分で書き込む方法もあります。

# write_csv_for_excel_utf8_bom.py
import csv
from pathlib import Path

file_path = Path("excel_friendly_utf8_bom.csv")

rows = [
  ["日付", "取引先", "金額"],
  ["2025-11-21", "株式会社サンプル", 100000],
  ["2025-11-22", "テスト商事", 50000],
]

with file_path.open("w", encoding="utf-8", newline="") as f:
  # UTF-8 の BOM を先頭に書き込む
  f.write("\ufeff")
  writer = csv.writer(f)
  writer.writerows(rows)

print(f"{file_path} を UTF-8(BOM 付き) で出力しました。")

Shift_JIS で出力する例

Windows の Excel での互換性を優先したい場合は、encoding="cp932" を使うと多くのケースで動きます。

# write_csv_for_excel_sjis.py
import csv
from pathlib import Path

file_path = Path("excel_friendly_sjis.csv")

rows = [
  ["日付", "取引先", "金額"],
  ["2025-11-21", "株式会社サンプル", 100000],
  ["2025-11-22", "テスト商事", 50000],
]

with file_path.open("w", encoding="cp932", newline="") as f:
  writer = csv.writer(f)
  writer.writerows(rows)

print(f"{file_path} を Shift_JIS 互換(cp932)で出力しました。")

Excel による「自動変換」への対策

Excel は CSV を開くときに、以下のような自動変換を行います。

  • 2025-11-21 → 日付型
  • 00123 → 123(先頭の 0 が消える)
  • 1-2 → 日付とみなされることがある
  • 大きな数字 → 指数表記(1.23E+08 など)

これを完全に防ぐのは難しいですが、以下のような対策があります。

  • 本当に重要な ID などは Excel ではなく .xlsx で扱う(openpyxl などで直接 Excel を出力)
  • 「先頭ゼロを保持したい文字列」は '00123 のように先頭にシングルクォートを付けて CSV に書き出す
  • 事前に「この列は Excel で数値に変換される」ことを利用側に伝えておく

たとえば、郵便番号を CSV に出力する場合:

zipcode = "00123"
excel_value = f"'{zipcode}" # 先頭にシングルクォート

として書き出すと、Excel 上では 00123 と表示されやすくなります。

 

まとめ

本記事では、「Python で業務効率化:ファイル操作&CSV/Excel 入門」と題して、

  • Python の open()with 文による基本的なファイル入出力
  • csv モジュールを使った CSV の読み書き(リスト形式/辞書形式)
  • openpyxl による Excel ファイル(.xlsx)の読み書き
  • Excel で読み込むことを意識した CSV の作成ポイント(文字コード・自動変換対策)

を紹介しました。

Python の文法をひととおり学んだあとは、今回のような「自分やチームの手作業を少し楽にするスクリプト」を書いてみると、学んだ知識が一気に実務に結びついてきます。

まずは、身近な Excel 作業を一つ選んで、「一部だけでも Python で自動化してみる」ことから始めてみてください。

"全員が技術者" ベイストリームは横浜発のPythonのプロフェッショナル集団です。
積極採用中!尖ったPythonエンジニアへの第一歩はこちらから