第9章: ファイル操作と入出力

9-file-input-output

この章では、Pythonにおけるファイル操作と入出力について学びます。ファイルを読み書きする機能は、プログラムにデータを保存したり、外部のデータを利用する際に重要です。この章では、テキストファイルやバイナリファイルの読み書き方法、ディレクトリ操作、コンソールからの入力と出力、そしてデータのシリアル化とデシリアル化について詳しく説明します。

目次

9.1 ファイルの読み書き (StreamReader, StreamWriter, Fileクラス)

Pythonでは、open()関数を使ってファイルを開き、読み書きすることができます。ファイル操作の基本的な流れとしては、ファイルを開いて操作し、最後にファイルを閉じることが推奨されます。

ファイルを開く、読み込む、閉じる

テキストファイルを読み込む例を見てみましょう。

# ファイルの読み込み
with open('sample.txt', 'r') as file:
    content = file.read()
    print(content)

このコードでは、withステートメントを使ってファイルを開いています。withステートメントを使うと、ファイルを開いた後に自動的に閉じられるので、ファイルを手動で閉じる必要がありません。

ファイルに書き込む

次に、ファイルにテキストを書き込む例です。

# ファイルへの書き込み
with open('output.txt', 'w') as file:
    file.write('Hello, World!')

このコードでは、ファイルにHello, World!というテキストを書き込んでいます。'w'モードを使うと、ファイルが存在しない場合は新たに作成され、存在する場合は内容が上書きされます。

読み込みモードと書き込みモード

  • 'r': 読み込み専用(ファイルが存在しないとエラー)
  • 'w': 書き込み専用(ファイルが存在しない場合は作成される。既存の内容は上書き)
  • 'a': 追記モード(既存の内容は保持され、ファイルの末尾にデータを追加)
  • 'b': バイナリモード(テキストではなくバイナリデータを扱う)

9.2 バイナリデータの操作 (BinaryReader, BinaryWriter)

テキストファイルの代わりに、バイナリファイルを操作する場合、バイナリモードでファイルを開く必要があります。

バイナリファイルの読み込み

with open('image.png', 'rb') as binary_file:
    data = binary_file.read()
    print(data[:10])  # 最初の10バイトを表示

'rb'モードを使ってファイルを開くと、バイナリデータを読み込むことができます。バイナリデータは通常、画像や音声ファイル、シリアライズされたデータなどを扱う際に使用されます。

バイナリファイルへの書き込み

with open('output.bin', 'wb') as binary_file:
    binary_file.write(b'\x00\x01\x02\x03\x04')

'wb'モードでは、バイナリデータを書き込むことができます。b'\x00\x01\x02'のようなバイト列を直接書き込むことができます。

9.3 ディレクトリとファイル操作 (Directory, FileInfoクラス)

Pythonでは、osモジュールやpathlibモジュールを使って、ディレクトリやファイルの操作を行うことができます。

ディレクトリの作成と削除

osモジュールを使って、ディレクトリを作成したり削除したりすることができます。

import os

# 新しいディレクトリを作成
os.makedirs('new_directory')

# ディレクトリを削除
os.rmdir('new_directory')

ファイルやディレクトリの存在確認

os.pathpathlibを使って、ファイルやディレクトリが存在するかを確認できます。

import os

# ファイルが存在するか確認
if os.path.exists('sample.txt'):
    print('ファイルが存在します')

ファイルのリストを取得

特定のディレクトリに存在するファイルをリストアップするには、os.listdir()を使用します。

files = os.listdir('.')
print(files)  # カレントディレクトリ内のファイルを表示

9.4 コンソール入力と出力

Pythonでは、input()関数を使ってユーザーからの入力を受け取り、print()関数で出力を行います。

コンソール入力

name = input('名前を入力してください: ')
print(f'こんにちは、{name}さん!')

このコードでは、ユーザーが名前を入力すると、その名前が出力されます。

コンソール出力のフォーマット

print()関数を使って、文字列のフォーマットを行うことができます。Pythonのf文字列(フォーマット済み文字列)を使うと、変数を埋め込んだ文字列を簡単に作成できます。

age = 25
print(f'私は{age}歳です')

9.5 シリアル化とデシリアル化 (JSON, XML形式)

シリアル化は、オブジェクトを保存可能な形式(ファイルやバイナリデータ)に変換する操作を指し、デシリアル化は、その逆で、保存されたデータをオブジェクトに戻す操作です。

JSONのシリアル化とデシリアル化

Pythonでは、jsonモジュールを使って、データをJSON形式に変換(シリアル化)したり、JSONデータをPythonオブジェクトに変換(デシリアル化)したりできます。

import json

# シリアル化PythonオブジェクトをJSONに変換
data = {'name': 'Alice', 'age': 30}
json_data = json.dumps(data)
print(json_data)  # {"name": "Alice", "age": 30}

# デシリアル化JSONをPythonオブジェクトに変換
data_back = json.loads(json_data)
print(data_back)  # {'name': 'Alice', 'age': 30}

XMLのシリアル化とデシリアル化

PythonでXMLを扱う場合は、xml.etree.ElementTreeモジュールを使うことができます。

import xml.etree.ElementTree as ET

# XMLデータを構築
root = ET.Element("person")
name = ET.SubElement(root, "name")
name.text = "Alice"
age = ET.SubElement(root, "age")
age.text = "30"

# XMLデータをファイルに保存
tree = ET.ElementTree(root)
tree.write("person.xml")

# XMLファイルを読み込む
tree = ET.parse('person.xml')
root = tree.getroot()
print(root.find('name').text)  # Alice

まとめ

この章では、Pythonにおけるファイル操作、ディレクトリ管理、コンソール入出力、シリアル化とデシリアル化の基本を学びました。これらのスキルを活用することで、プログラムが外部データと連携したり、ユーザーとのインタラクションを行うことが可能になります。次の章では、例外処理とデバッグについて詳しく見ていきます。

目次