Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例

  1. ホーム
  2. ブログ
  3. ソフトウェア開発

ソフトウェア開発

Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例

ほとんどすべての実際のスクリプトは、ファイルの読み取りまたは書き込みを行います。ファイルを開く安全な方法、適切なモードの選択、CSV と JSON の処理、pathlib を使用したパスの操作、データを消去する間違いを避ける方法を学びます。

読了目安9分
Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例

ポイント

  • ファイルは常に with ブロックで開かれ、自動的に閉じられます。
  • モード"w"は既存のファイルを消去します。追加する場合は"a"、上書きを拒否する場合は"x"を使用します。
  • ファイル オブジェクトをループして、すべてをメモリにロードせずに大きなファイルを読み取ります。
  • encoding="utf-8" を明示的に渡し、パスの構築には pathlib を優先します。

ログ、レポート、構成、エクスポート: 遅かれ早かれ、すべてのスクリプトがファイル システムにアクセスします。 Python ファイル処理 は始めるのが簡単ですが、コードが信頼できるかどうか、またはデータを静かに破壊するかどうかは、いくつかの詳細によって決まります。

このガイドでは、安全な習慣に焦点を当てて、テキスト ファイル、CSV、JSON、バイナリ データおよびパスについて説明します。これらの例は、一時フォルダー内の Python 3.13 で実行しました。示されている出力は、その実行からのものです。

open() と を使用してファイルを開きます

組み込み関数 open() はファイル オブジェクトを返します。 with ブロック内で使用します。

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

ブロックが終了すると、内部でエラーが発生した場合でも、Python はファイルを閉じます。 with がない場合は、close() を自分で呼び出す必要があり、例外によってその行がスキップされる可能性があります。ファイルを閉じた後にそのファイルを使用すると、エラーが発生します。

file.read()

# ValueError: I/O operation on closed file.

ファイルモード

open() の 2 番目の引数は、何をするつもりかを示します。

モード 意味 ファイルが存在する場合 そうでない場合
r 読み取り (デフォルト) 開けます エラー
w 書く 最初に消去します 作成します
ある 追加 最後に追加します 作成します
× 排他的作成 エラー 作成します
r+ 読み書き 開けます エラー

バイナリデータの場合は、"rb"または"wb"と同様にbを追加します。 Text がデフォルトですが、t として明示的に記述することもできます。

書いて追加する

write()は改行しないので、\nを自分で入れてください。追加すると、既存のものは保持されます。

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

モードと比較してください"w"これにより、警告はまったく表示されずに、3 行が 1 行に置き換えられました。

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

上書きしてはいけない場合は"x"を使用してください。 notes.txt がすでに存在していたため、テストでは FileExistsError が発生しました。

ファイルを読む

読み取る方法はいくつかあり、正しい選択はファイルのサイズによって異なります。

アプローチ 返品 こんな方に最適
file.read() すべてを備えた 1 つの文字列 小さなファイル
file.readline() 次の行 ヘッダーの読み取り
file.readlines() 行のリスト リストとして必要な小さなファイル
ファイル内の行の場合 一度に 1 行ずつ あらゆるサイズ、特に大きなファイル
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

\n 文字が生の文字列に保持されていることに注目してください。 strip() はそれらを削除します。ファイル オブジェクトはその位置も記憶しているため、中断したところから読み取りが続行されます。

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

ファイルのループ処理は、大きなログとエクスポートの重要なテクニックです。一度に 1 行ずつ読み取るため、数ギガバイトのファイルをメモリに収める必要はありません。

ファイルエラーを処理する

ファイルが見つからないか、ロックされているか、読み取れない可能性があるため、次のことを計画してください。

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
例外 代表的な原因
ファイルが見つかりませんエラー パスが存在しません
ファイル存在エラー 既存のファイルのモード x
許可エラー 許可されていない、または Windows でロックされています
IsADirectoryError パスはフォルダーです
Unicodeデコードエラー 間違ったエンコーディングが使用されました

チェックしてから開くまでの間にファイルが消える可能性があるため、最初に exists() でチェックするのではなく、ファイルを開いてエラーをキャッチしてみてください。 Python 例外処理 のガイドでは、このアプローチについて説明しています。

CSVファイル

引用符で囲まれた値にはカンマが含まれる可能性があるため、CSV 行をカンマで分割しないでください。標準 csv モジュールはこれらのルールを処理します。 DictWriter と DictReader が最も読みやすいオプションです。

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

2 つの詳細が重要です。ドキュメントで推奨されているように、CSV ファイルを開くときに Windows で空白行を防ぐために newline="" を渡します。そして、すべての値は 文字列 (偶数) として返されるため、合計に int() が必要でした。大量のデータを扱う場合には、pandas などのライブラリの方が適しています。

JSONファイル

JSON は、構成データと API データの通常の形式です。 Python 辞書 にきちんとマッピングされており、次のものがリストされています。

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

名前を覚えておいてください。dump と load はファイルを操作し、dumps と loads は文字列を操作します。日付などの型は直接保存できないため、最初に文字列に変換する必要があります。

pathlib を使用してパスを操作する

パスを文字列で結合すると、オペレーティング システム間で破損します。標準の pathlib モジュールは区切り文字を処理し、便利なショートカットを提供します。

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
タスク パスライブラリ
パスを結合する パス("a") / "b.txt"
フォルダーの作成 path.mkdir(parents=True、exist_ok=True)
全文を読むか書く read_text(), write_text()
ファイルの検索 glob("*.csv"), rglob("*.py")
ファイルを削除する path.unlink()
現在のスクリプトのフォルダーを取得します Path(__file__).parent

最後の方法は、よくある頭痛を解決します。相対パスは、スクリプトが存在する場所からではなく、スクリプトを実行した場所から解決されるため、Path(__file__).parentからパスを構築すると、多くの「ファイルが見つからない」という予期せぬ事態を回避できます。

バイナリファイル

画像、PDF、ZIP ファイルはテキストではありません。 b でそれらを開くと、エンコードを行わずに bytes を読み書きします。

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

より安全な書き込み

重要なファイルの書き込み中にプログラムがクラッシュすると、破損した結果が残る可能性があります。一般的な修正方法は、最初に一時ファイルに書き込んでから、それを所定の場所に交換することです。

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace()は宛先を上書きします。同じファイル システム上では、通常、名前変更はアトミックであるため、読み手には、書きかけの混合ではなく、古いファイルまたは新しいファイルが表示されます。

ヒント: チェックせずに、ユーザー入力から直接ファイル パスを構築しないでください。 ../../secrets.txt のような値を指定すると、目的のフォルダー外のファイルに到達する可能性があります。これはパス トラバーサルの脆弱性として知られています。

実践例: ログを要約する

この短いスクリプトには、いくつかのアイデアがまとめられています。ログを一度に 1 行ずつ読み取るため、そのサイズは問題になりません。Counter を使用して各レベルをカウントし、新しいファイルに概要を書き込みます。

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

サンプル ログには 5 行がありました。空行は改行 line.split()[0] となるため、実際のスクリプトでは最初に空行をスキップする必要があります。

よくある間違い

  • "a" を意味するのに "w" を使用します。 何も書き込まなくても、既存のデータは開くとすぐに消えます。
  • エンコーディングの省略。 デフォルトはシステムによって異なるため、Linux で動作するスクリプトは、アクセント付きのテキストや絵文字を使用すると Windows では失敗する可能性があります。
  • 巨大なファイルに対して read() を呼び出す。 これによりメモリが枯渇する可能性があるため、代わりに行をループします。
  • CSV 値の int() を忘れます。 "10" + "20" を実行すると "1020" が返されます。
  • CSV の newline="" は省略します。 Windows では予期しない空白行が表示される場合があります。
  • ファイル コードをテストしていません。 pytest の tmp_path フィクスチャを使用して、テストが実際のファイルに触れないようにします。 pytest チュートリアルをご覧ください。

まとめ

ここでは、いくつかの習慣がほぼすべてをカバーしています。with を使用し、エンコーディングを設定し、"w" についてよく考え、難しい部分は csv、json、および pathlib に任せます。練習するには、CSV を読み取り、1 列を合計し、JSON 概要を新しいフォルダーに保存する小さなスクリプトを作成します。

よくある質問

Python でファイルを 1 行ずつ読み取るにはどうすればよいですか?

with ブロックで開き、ファイル オブジェクトをループします。これは一度に 1 行ずつ読み取るため、非常に大きなファイルでもうまく機能します。

w モードと a モードの違いは何ですか?

モード w では、ファイルが開くとすぐに既存のコンテンツがすべて消去されます。モード a は、既存のコンテンツを保持し、ファイルの末尾に新しいデータを追加します。

ファイルを開くときに with を使用する必要があるのはなぜですか?

with ステートメントは、エラーが発生した場合でも、ブロックが終了するとファイルを自動的に閉じます。これにより、リークが防止され、データが確実に書き込まれるようになります。

Python にファイルが存在するかどうかを確認するにはどうすればよいですか?

pathlib の Path(“name.txt”).exists() を使用します。直後に開く予定がある場合は、通常、最初にチェックするよりも FileNotFoundError をキャッチする方が信頼性が高くなります。

Windows で CSV に空白行が含まれるのはなぜですか?

おそらく newline=”” を付けずにファイルを開いた可能性があります。 csv モジュールは行末自体を管理するため、余分な空白行を避けるためにその引数を渡します。

学び続ける

Stack Quoraと連携する

テスト、WordPress、または SEO についてサポートが必要ですか?

私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。

読み続けてください

詳しいガイドはこちら テスト、AI、最新の開発

この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。

人工知能

AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法

AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。

記事を読む →
DevOps

環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている

実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。

記事を読む →
ソフトウェア開発

API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理

API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。

記事を読む →
テスト自動化

Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い

Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。

記事を読む →
ソフトウェアテスト

コードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味

実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。

記事を読む →
データベースとSQL

SQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか

DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。

記事を読む →
データベースとSQL

SQL ビューの説明: 作成、使用、落とし穴の回避、例を示します

SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。

記事を読む →
ソフトウェア開発

TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト

TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。

記事を読む →
ソフトウェア開発

Python *args と **kwargs の説明: 柔軟な関数と明確な例

Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。

記事を読む →
ソフトウェア開発

Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合

Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。

記事を読む →
人工知能

AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み

AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。

記事を読む →
DevOps

モニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い

モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。

記事を読む →
DevOps

Docker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する

Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。

記事を読む →
テスト自動化

TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか

TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。

記事を読む →
ソフトウェアテスト

ユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例

ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。

記事を読む →
データベースとSQL

SQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ

SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。

記事を読む →
データベースとSQL

SQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い

SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。

記事を読む →
ソフトウェア開発

JWTとは何ですか? JSON Web トークンを実際の例で説明する

JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。

記事を読む →
ソフトウェア開発

JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例

JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。

記事を読む →
ソフトウェア開発

Python ジェネレーターと収量の説明: 実際の例でメモリを節約する

Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。

記事を読む →
人工知能

埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明

埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。

記事を読む →
DevOps

Blue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法

ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。

記事を読む →
テスト自動化

不安定なテスト: 問題の原因とそれを永久に修正する方法

不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。

記事を読む →
ソフトウェアテスト

負荷テストとストレス テスト: 違い、メトリクス、および k6 の例

ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。

記事を読む →
ソフトウェアテスト

テスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか

テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。

記事を読む →
データベースとSQL

SQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正

SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。

記事を読む →
データベースとSQL

SQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス

SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。

記事を読む →
ソフトウェア開発

JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト

ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。

記事を読む →
ソフトウェア開発

Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例

Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。

記事を読む →
ソフトウェア開発

Git mergeとrebaseの違い:例と使い分け

Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。

記事を読む →
ソフトウェア開発

Pythonのリスト内包表記:構文・例・使うべきでない場面

Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。

記事を読む →
データベースとSQL

SQL JOINを例で解説(Inner・Left・Right・Full)

サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。

記事を読む →