PythonのCSVファイル操作(csvモジュール)とは?

CSV(Comma Separated Values)ファイルは、カンマ区切りでデータを記録するシンプルなテキスト形式で、データ交換や保存によく使われています。Pythonでは、標準ライブラリのcsvモジュールを使って、CSVファイルの読み書きを簡単に行うことができます。 この記事では、PythonでのCSVファイルの基本的な操作方法から、データの読み込み、書き込み、さらには応用的な使い方まで解説します。

CSVファイルとは?

CSVファイルは、データをカンマ(,)で区切って表現する形式のファイルです。各行が1レコードを表し、列の値がカンマで区切られています。例えば、次のようなCSVファイルがあります。

名前,年齢,職業
田中,28,エンジニア
鈴木,35,デザイナー
佐藤,22,学生

このように、CSVファイルは多くのデータベースやスプレッドシートで利用され、簡単なデータ保存や転送に適しています。

PythonでのCSVファイル操作

Pythoncsvモジュールは、CSVファイルを扱うための便利な関数を提供しています。代表的な操作には、次のようなものがあります。

  • 読み込み:CSVファイルからデータを読み取る
  • 書き込み:データをCSVファイルに書き込む
  • 辞書形式での操作:CSVの各行を辞書として扱う 次に、各操作を具体的に見ていきましょう。

CSVファイルの読み込み

CSVファイルを読み込むには、csv.reader()を使います。この関数は、CSVファイルを1行ずつリスト形式で読み込みます。

csv.reader()を使ったCSVファイルの読み込み

import csv
# sample.csv ファイルを読み込む
with open('sample.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file)
    
    # 行ごとにデータを読み込む
    for row in reader:
        print(row)

出力例

['名前', '年齢', '職業']
['田中', '28', 'エンジニア']
['鈴木', '35', 'デザイナー']
['佐藤', '22', '学生']

この例では、csv.reader()を使ってファイルを読み込み、各行をリストとして出力しています。withステートメントを使うことで、ファイルの自動クローズが保証されます。

csv.DictReader()で辞書形式での読み込み

csv.DictReader()を使うと、CSVの各行を辞書形式で読み取ることができます。列のヘッダーをキーとして、各行のデータが値として扱われます。

import csv
# sample.csv ファイルを辞書形式で読み込む
with open('sample.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    
    # 各行を辞書として読み込む
    for row in reader:
        print(row)

出力例

{'名前': '田中', '年齢': '28', '職業': 'エンジニア'}
{'名前': '鈴木', '年齢': '35', '職業': 'デザイナー'}
{'名前': '佐藤', '年齢': '22', '職業': '学生'}

このように、列のヘッダーが辞書のキーとして扱われるため、より可読性が高くなります。

CSVファイルへの書き込み

次に、CSVファイルにデータを書き込む方法について見ていきます。csv.writer()を使うと、リスト形式のデータをCSVファイルに書き込むことができます。

csv.writer()を使ったCSVファイルの書き込み

import csv
# 書き込むデータ
data = [
    ['名前', '年齢', '職業'],
    ['田中', 28, 'エンジニア'],
    ['鈴木', 35, 'デザイナー'],
    ['佐藤', 22, '学生']
]
# output.csv に書き込み
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file)
    
    # 行ごとに書き込む
    writer.writerows(data)

writer.writerows()を使うと、複数の行を一度に書き込むことができます。newline=''を指定することで、行間に不要な空行が入らないようにしています。

csv.DictWriter()で辞書形式での書き込み

csv.DictWriter()を使えば、辞書形式のデータをCSVに書き込むことができます。書き込み時に列の順序を指定する必要があります。

import csv
# 書き込むデータ
data = [
    {'名前': '田中', '年齢': 28, '職業': 'エンジニア'},
    {'名前': '鈴木', '年齢': 35, '職業': 'デザイナー'},
    {'名前': '佐藤', '年齢': 22, '職業': '学生'}
]
# output.csv に辞書形式で書き込み
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
    fieldnames = ['名前', '年齢', '職業']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    
    # ヘッダーを書き込み
    writer.writeheader()
    
    # 行ごとに書き込み
    writer.writerows(data)

この方法では、DictWriterを使ってデータを辞書形式で書き込んでいます。writeheader()を呼び出すことで、CSVファイルの最初の行にヘッダーを出力します。

CSV操作のオプション設定

csvモジュールでは、カンマ以外の区切り文字や、引用符の扱いなどを柔軟に設定できます。

区切り文字の変更

デフォルトでは、CSVはカンマで区切られますが、区切り文字を変更することも可能です。例えば、タブ区切り(TSV)ファイルを扱う場合には、delimiterを指定します。

import csv
# タブ区切りのデータを読み込む
with open('sample.tsv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter='\t')
    
    for row in reader:
        print(row)

引用符の扱い

CSV ファイル内で値にカンマや改行が含まれる場合、値を引用符(")で囲む必要があります。csvモジュールでは、この引用符の扱いも指定できます。

import csv
# 引用符で囲まれたデータを書き込む
with open('output.csv', 'w', encoding='utf-8', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_ALL)
    writer.writerow(['名前', '年齢', '職業'])
    writer.writerow(['田中', 28, 'エンジニア'])
    writer.writerow(['鈴木', 35, 'デザイナー'])

この例では、quoting=csv.QUOTE_ALLを指定することで、すべての値が引用符で囲まれて出力されます。

CSV操作の注意点

  1. ファイルのエンコーディング
    CSVファイルを扱う際には、適切な文字エンコーディングを指定することが重要です。日本語を含むファイルでは、encoding='utf-8'を指定することで、文字化けを防ぐことができます。
  2. newline=''の指定
    Windows環境では、CSVファイルに書き込む際にnewline=''を指定することで、行の間に不要な空行が挿入されるのを防げます。
  3. エラーハンドリング
    大規模なデータセットを扱う場合や、外部からのデータを処理する場合、フォーマットの不備やエラーに備えて例外処理を取り入れると安全です。

結論

Pythoncsvモジュールを使うと、CSVファイルの読み書きが簡単に行えます。csv.reader()csv.writer()でシンプルにデータを扱えるだけでなく、DictReaderDictWriterを使えば辞書形式でデータを扱うことができ、複雑なデータ処理も容易になります。また、区切り文字や引用符のカスタマイズも柔軟にできるため、さまざまなフォーマットのデータを効率的に処理することが可能です。 日常的なデータ管理や、データベースやAPIとの連携など、さまざまな場面でCSVファイルを活用できるよう、ぜひcsvモジュールの基本を理解して活用しましょう。