こんにちは、Tech Samuraiです!
これまでの冒険で、私たちはファイルや時間を操る、Pythonの強力な標準ライブラリを探検してきました。
さて、仕事やデータ分析の現場で、最もよく出会うファイル形式の一つが**CSV (Comma-Separated Values)** です。表形式のデータをカンマで区切って保存した、シンプルで汎用性の高い形式ですね。しかし、「このCSVファイルの各行に、計算結果を新しい列として追加したいな…」と思ったとき、わざわざExcelやGoogleスプレッドシートを開くのは少し面倒ではありませんか?
今回のテーマは、そんな日常の「ちょっとしたデータ処理」を自動化するための、Pythonの標準ライブラリ**`csv`**です。このライブラリを使い、**簡単な売上データから、合計金額を計算して新しい列に追加する「売上レポートジェネレーター」**を開発します!
ステップ1:準備 – 元となるCSVファイル
まずは、処理の元となる売上データを用意します。以下の内容で`sales_data.csv`という名前のファイルを作成し、Pythonスクリプトと同じディレクトリに保存してください。
商品,単価,数量
リンゴ,120,15
バナナ,80,24
オレンジ,150,8
ぶどう,300,5
私たちの目標は、このファイルの各行に「単価 × 数量」の計算結果である「合計金額」という4列目を追加した、新しいCSVファイル(`report.csv`)を生成することです。
ステップ2:武器の紹介 – `csv.reader`と`csv.writer`
`csv`ライブラリの主役は、この2つのオブジェクトです。
csv.reader
: CSVファイルを読み込むための道具。ファイルを開いてこれを適用すると、各行を**文字列のリスト**として、一行ずつ順番に取り出すことができます。csv.writer
: CSVファイルに書き込むための道具。これに**リスト形式のデータ**を渡すと、カンマで区切られた行として、ファイルに綺麗に書き込んでくれます。
ステップ3:実装 – レポート生成スクリプトの全コード
それでは、`csv`ライブラリを使って、レポートを生成するスクリプトを書いていきましょう。
import csv
input_filename = 'sales_data.csv'
output_filename = 'report.csv'
try:
# 読み込み用と書き込み用のファイルを同時に開く
with open(input_filename, 'r', encoding='utf-8') as infile, \
open(output_filename, 'w', encoding='utf-8', newline='') as outfile:
# 1. CSVリーダーとライターを準備
reader = csv.reader(infile)
writer = csv.writer(outfile)
# 2. ヘッダー行を読み込み、新しいヘッダーを書き込む
header = next(reader) # next()で最初の1行(ヘッダー)を読み飛ばす
writer.writerow(header + ['合計金額'])
# 3. データ行を一行ずつループ処理
for row in reader:
try:
# 4. 文字列を数値に変換して計算
# row[1]は単価、row[2]は数量
price = int(row[1])
quantity = int(row[2])
total_price = price * quantity
# 5. 元の行に計算結果を追加して書き込む
writer.writerow(row + [total_price])
except ValueError:
print(f"警告: 数値に変換できない行をスキップしました: {row}")
except IndexError:
print(f"警告: 列が不足している行をスキップしました: {row}")
print(f"レポートファイル '{output_filename}' が正常に作成されました。")
except FileNotFoundError:
print(f"エラー: 入力ファイル '{input_filename}' が見つかりません。")
コードのポイント解説
with open(...) as infile, open(...) as outfile:
with
文をカンマで繋げることで、複数のファイルを同時に、かつ安全に(処理が終わったら自動で閉じてくれる)開くことができます。next(reader)
リーダーオブジェクトから最初の1行(ヘッダー)だけを読み込みます。これにより、ループ処理がデータ行から始まるようになります。writer.writerow(header + ['合計金額'])
読み込んだヘッダーリストに、新しい列名`’合計金額’`を追加して、出力ファイルに書き込んでいます。price = int(row[1])
CSVから読み込んだデータは**全て文字列**です。計算するためには、int()
を使って数値(整数)に変換する(キャストする)必要があります。ここが非常に重要なポイントです。try-except
ブロック
もしCSVファイルに空の行や、数値でないデータが含まれていた場合、int()
の変換でエラーが発生します。try-except
で囲むことで、プログラムがクラッシュするのを防ぎ、問題のある行をスキップして処理を続行できるようにしています。
ステップ4:実行結果の確認
このスクリプトを実行すると、同じフォルダに`report.csv`というファイルが生成されます。中身は以下のようになっているはずです。
商品,単価,数量,合計金額
リンゴ,120,15,1800
バナナ,80,24,1920
オレンジ,150,8,1200
ぶどう,300,5,1500
見事に、合計金額が計算された新しい列が追加されましたね!
まとめ
今回は、Pythonの標準ライブラリ`csv`を使い、日常的なデータ処理を自動化する方法を探検しました。
- CSVファイルを一行ずつ読み込む
csv.reader
- 新しいCSVファイルにデータを書き出す
csv.writer
- 計算のために不可欠な、**文字列から数値への型変換**
Pandasのような高機能なライブラリを導入するまでもない、ちょっとしたCSVの加工なら、標準ライブラリだけで十分に、そして高速にこなせることがお分かりいただけたかと思います。
次回は、メールを自動送信!デイリーリマインダーを`smtplib`ライブラリを探検します。お楽しみに!
コメント