メモを保存したいのか、売上一覧を渡したいのか、設定を読み込みたいのかで、向くファイル形式は違います。拡張子だけを替えてもデータの形は変わらないので、先に何を一件として扱うかを決めます。
txt・csv・jsonの使い分け
一続きの文章はtxt、同じ列を持つ明細はcsv、項目名と値を組み合わせる設定はjsonが扱いやすい形です。たとえば作業メモはtxt、店舗別の実績はcsv、保存先と通知の設定はjsonにできます。用途が変われば、読み書きに使う処理も変えます。
テキストファイルでは文字コードを明示します。日本語が読めないときにerrors="ignore"で消して進めると、欠けた値のまま処理が続きます。元のファイルを残し、作成元の文字コードを調べます。
三つの形式を保存する例
次は架空の小さなデータを、それぞれ別ファイルへ保存する例です。空の作業フォルダーで実行してください。xモードを使うため、同名ファイルがあると停止します。
import csv
import json
with open("memo.txt", "x", encoding="utf-8") as out:
out.write("入力件数を確認する\n")
with open("shops.csv", "x", encoding="utf-8-sig", newline="") as out:
writer = csv.writer(out)
writer.writerow(["店舗", "件数"])
writer.writerow(["東京", 3])
with open("settings.json", "x", encoding="utf-8") as out:
json.dump({"output_dir": "reports", "notify": False},
out, ensure_ascii=False, indent=2)
with open("settings.json", encoding="utf-8") as src:
settings = json.load(src)
print(settings["output_dir"])
実行後は三つのファイルができ、画面にはreportsと出ます。withの区間を抜けるとファイルが閉じられます。CSVではnewline=""を付け、行の区切りをcsvモジュールに任せます。utf-8-sigはBOM付きUTF-8で、Excelへ渡すCSVで選ぶ方法の一つです。
上書きと追記の使い分け
wモードは既存ファイルを開いた時点で内容を切り詰めます。書き込みに失敗したら前の内容へ戻る、という指定ではありません。元データを守りたい作業では、別名で出力し、確認後に入れ替える手順を用意します。
aモードは末尾への追記です。txtの作業記録には使えても、普通のJSONファイルへjson.dumpを繰り返すと、複数の値が連なり、一つのJSON文書として読めなくなります。JSONを更新するときは、全体を読み、値を変更し、新しいファイルへ書き出す方法から始めます。
この例も三つの保存を一つの取引として扱ってはいません。途中で止まれば、それ以前のファイルは残ります。複数ファイルを作る実務では、作成済みの名前と失敗した場所を記録してください。
保存後に読むもの
ファイルがあるかだけでなく、読み直した値と元データが合うかを確認します。csvなら列名と行数、jsonなら必要なキーと型、txtなら改行と日本語の表示を見ます。保存した場所を絶対パスで控えると、別のフォルダーへ出力していた場合にも気づきやすくなります。
関連する作業
文字の整形やCSV集計へ進む場合は、次の記事がつながります。
