2025年5月21日水曜日

PythonでCSVファイルを操作する方法

 はい、PythonでCSVファイルを操作する方法について詳しく解説します。CSVファイルの読み書きは、csvモジュールを使うのが一般的で、非常に効率的です。また、リストやタプルへの読み込み、そして書き込みについても具体例を交えて説明します。


1. CSVモジュールのインポート

まず、csvモジュールをインポートします。

Python
import csv

2. CSVファイルへの書き込み

CSVファイルにデータを書き込む方法はいくつかありますが、ここでは基本的な方法と、リスト/タプルへの書き込み方を示します。

2.1. writerow() を使って1行ずつ書き込む

最も基本的な書き込み方法です。

Python
import csv

# 書き込むデータ(リストのリスト形式)
data_to_write = [
    ['名前', '年齢', '都市'],
    ['太郎', 25, '東京'],
    ['花子', 30, '大阪'],
    ['一郎', 22, '福岡']
]

# ファイルを開いて書き込む
# 'w' は書き込みモード
# newline='' は、CSVファイル書き込み時の余分な改行を防ぐために重要です
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)

    # ヘッダー行を書き込む
    writer.writerow(data_to_write[0])

    # データ行を書き込む
    for row in data_to_write[1:]:
        writer.writerow(row)

print("output.csv にデータを書き込みました。")

解説:

  • open('output.csv', 'w', newline='', encoding='utf-8'):
    • 'output.csv': 作成するCSVファイル名。
    • 'w': 書き込みモード。もしファイルが存在すれば上書きされます。
    • newline='': 非常に重要です。 これを指定しないと、行ごとに余分な空白行が挿入されてしまいます。
    • encoding='utf-8': 文字エンコーディングを指定します。日本語を扱う場合はutf-8が推奨されます。
  • csv.writer(csvfile): csv.writerオブジェクトを作成します。これにより、CSV形式での書き込みが可能になります。
  • writer.writerow(row): row(リストまたはタプル)の内容を1行としてCSVファイルに書き込みます。

2.2. writerows() を使って複数の行をまとめて書き込む

writerow()をループで回す代わりに、writerows()を使ってリストのリスト形式のデータを一度に書き込むことができます。

Python
import csv

# 書き込むデータ(リストのリスト形式)
data_to_write = [
    ['名前', '年齢', '都市'],
    ['太郎', 25, '東京'],
    ['花子', 30, '大阪'],
    ['一郎', 22, '福岡']
]

with open('output_multiple.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data_to_write) # データをまとめて書き込む

print("output_multiple.csv にデータをまとめて書き込みました。")

2.3. ディクショナリ(辞書)を使って書き込む (csv.DictWriter)

ヘッダー名を指定して、ディクショナリのリストとしてデータを書き込む場合に便利です。列の順序を意識せずに書き込めるのがメリットです。

Python
import csv

# 書き込むデータ(ディクショナリのリスト形式)
data_to_write_dict = [
    {'名前': '次郎', '年齢': 40, '都市': '札幌'},
    {'名前': '三郎', '年齢': 35, '都市': '名古屋'},
    {'名前': '四郎', '年齢': 28, '都市': '神戸'}
]

# ヘッダーとして使用するフィールド名
fieldnames = ['名前', '年齢', '都市']

with open('output_dict.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader() # ヘッダー行を書き込む
    writer.writerows(data_to_write_dict) # データをまとめて書き込む

print("output_dict.csv に辞書形式でデータを書き込みました。")

3. CSVファイルの読み込み

CSVファイルからデータを読み込む際も、csvモジュールを使用します。読み込んだデータをリストやタプルに格納する方法も示します。

3.1. reader() を使って1行ずつ読み込む

基本的な読み込み方法です。各行がリストとして読み込まれます。

Python
import csv

# 読み込んだデータを格納するリスト
data_from_csv = []

# ファイルを開いて読み込む
# 'r' は読み込みモード
with open('output.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)

    for row in reader:
        data_from_csv.append(row)

print("output.csv から読み込んだデータ:")
for row in data_from_csv:
    print(row)

解説:

  • open('output.csv', 'r', newline='', encoding='utf-8'):
    • 'r': 読み込みモード。
  • csv.reader(csvfile): csv.readerオブジェクトを作成します。これにより、CSV形式での読み込みが可能になります。
  • for row in reader:: readerオブジェクトはイテレータなので、ループで1行ずつ取り出すことができます。各rowは文字列のリストとして返されます。

3.2. 全行をリストのリストとして読み込む

CSVファイル全体を、各行がリストであるようなリスト(リストのリスト)として一度に読み込むことができます。

Python
import csv

all_data = []

with open('output.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    all_data = list(reader) # readerオブジェクトをリストに変換

print("output.csv から読み込んだ全データ:")
for row in all_data:
    print(row)

3.3. DictReader() を使ってディクショナリ(辞書)として読み込む

ヘッダー行をキーとして、各行をディクショナリとして読み込む場合に便利です。

Python
import csv

data_from_csv_dict = []

with open('output_dict.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile) # DictReaderを使用

    for row in reader:
        data_from_csv_dict.append(row)

print("\noutput_dict.csv から読み込んだデータ(辞書形式):")
for row in data_from_dict:
    print(row)
    print(f"名前: {row['名前']}, 年齢: {row['年齢']}, 都市: {row['都市']}") # キーでアクセスできる

解説:

  • csv.DictReader(csvfile): ヘッダー行を自動的に読み込み、各行のデータをそのヘッダー名をキーとするディクショナリとして返します。

4. リストやタプルへの読み込み・書き込み

CSVモジュールのreaderwriterは、デフォルトでリストを扱います。タプルを扱う場合も、ほとんど同じように機能します。

4.1. リストへの読み込み(再掲)

上記で示した通り、csv.readerで読み込んだ各行は自動的にリストになります。

Python
import csv

# 各行がリストとして格納される
list_of_lists = []

with open('output.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        list_of_lists.append(row)

print("\nリストのリストとして読み込み:")
print(list_of_lists)

4.2. タプルへの変換と書き込み

読み込んだリストの各行をタプルに変換して格納したり、タプルのデータをCSVに書き込んだりすることも可能です。

a) 読み込んだリストの行をタプルに変換して格納する

Python
import csv

# 各行がタプルとして格納される
list_of_tuples = []

with open('output.csv', 'r', newline='', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        list_of_tuples.append(tuple(row)) # リストをタプルに変換

print("\nタプルのリストとして読み込み:")
print(list_of_tuples)

b) タプルのリストをCSVに書き込む

csv.writer.writerow()csv.writer.writerows() は、リストでもタプルでも受け付けるため、特別な操作は不要です。

Python
import csv

# 書き込むデータ(タプルのリスト形式)
data_as_tuples = [
    ('商品名', '価格', '在庫数'),
    ('りんご', 150, 100),
    ('みかん', 80, 200),
    ('ぶどう', 300, 50)
]

with open('output_tuples.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows(data_as_tuples) # タプルのリストを書き込む

print("output_tuples.csv にタプル形式でデータを書き込みました。")

5. その他の注意点

  • デリミタの変更: CSVファイルは通常カンマ区切りですが、タブ区切りやセミコロン区切りの場合もあります。その場合は、csv.reader()csv.writer()delimiter 引数で区切り文字を指定します。
    Python
    # 例:タブ区切りファイルを読み込む場合
    with open('tab_separated.tsv', 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter='\t')
        # ...
    
  • クォーティング: CSVファイルでは、カンマを含むデータや改行を含むデータはダブルクォーテーションで囲まれることがあります。csvモジュールはこれらのクォーティングを自動的に処理してくれます。
  • エラーハンドリング: ファイルが存在しない場合や書き込み権限がない場合など、エラーが発生する可能性があります。実際のアプリケーションでは、try-exceptブロックなどを使ってエラーハンドリングを行うことが重要です。

まとめ

Pythonのcsvモジュールを使うことで、CSVファイルの読み書きを簡単に行うことができます。

  • 書き込み: csv.writer()writerow()/writerows()、または csv.DictWriter() を使用。newline='' が重要。
  • 読み込み: csv.reader() でリストのリストとして、または csv.DictReader() で辞書のリストとして読み込み。
  • リスト/タプル: csvモジュールはデフォルトでリストを扱いますが、タプルも問題なく処理できます。読み込み時にtuple()で変換したり、書き込み時にタプルを渡したりできます。

これらの機能を活用して、Pythonで効率的にCSVファイルを操作してください。

0 件のコメント:

コメントを投稿