PythonでCSVファイルを扱う方法と標準ライブラリ

プログラミング

PythonでCSVファイルを扱う方法

PythonでCSV(Comma Separated Values)ファイルを扱うことは、データ処理において非常に一般的です。CSVファイルは、表形式のデータをテキスト形式で保存するためのシンプルなフォーマットであり、多くのアプリケーションやデータベースでサポートされています。Pythonでは、標準ライブラリにCSVファイルを扱うための強力なモジュールが用意されており、これを利用することで、ファイルの読み込み、書き込み、解析などを簡単に行うことができます。

CSVモジュールの基本

Pythonの標準ライブラリに含まれるcsvモジュールは、CSVファイルの操作に特化しています。このモジュールを使うことで、区切り文字(通常はカンマ)や引用符の扱い、ヘッダー行の有無などを柔軟に指定しながら、CSVデータをPythonのリストや辞書などのデータ構造に変換したり、逆にPythonのデータ構造をCSVファイルとして出力したりできます。

CSVファイルの読み込み

CSVファイルを読み込むには、まずopen()関数を使ってファイルを開き、そのファイルオブジェクトをcsv.reader()に渡します。csv.reader()はイテレータを返します。このイテレータをforループなどで順番に処理していくことで、CSVファイルの各行をリストとして取得できます。

例:

import csv

with open(‘sample.csv’, ‘r’, newline=”) as csvfile:
csv_reader = csv.reader(csvfile)
for row in csv_reader:
print(row)

ここで、newline=”を指定することが重要です。これは、Pythonが自動的に改行コードを変換するのを防ぎ、CSVファイル本来の改行を維持するためです。

CSVファイルの書き込み

CSVファイルにデータを書き込む場合も同様に、open()関数でファイルを書き込みモード(’w’)で開きます。csv.writer()オブジェクトを作成し、そのwriterow()メソッド(1行書き込み)またはwriterows()メソッド(複数行書き込み)を使ってデータを書き込みます。

例:

import csv

data = [
[‘Name’, ‘Age’, ‘City’],
[‘Alice’, ’30’, ‘New York’],
[‘Bob’, ’25’, ‘Los Angeles’]
]

with open(‘output.csv’, ‘w’, newline=”) as csvfile:
csv_writer = csv.writer(csvfile)
csv_writer.writerows(data)

辞書形式でのCSV操作

CSVファイルがヘッダー行を持っている場合、各行をリストとして扱うよりも、ヘッダー名をキーとする辞書として扱いたい場合があります。csvモジュールにはcsv.DictReader()とcsv.DictWriter()が用意されており、これらを使うと辞書形式でのデータの読み書きが容易になります。

DictReaderによる読み込み

csv.DictReader()は、最初の行をヘッダーとして解釈し、それ以降の各行をヘッダー名をキーとする辞書として返します。

例:

import csv

with open(‘sample_with_header.csv’, ‘r’, newline=”) as csvfile:
dict_reader = csv.DictReader(csvfile)
for row in dict_reader:
print(row[‘Name’], row[‘Age’])

DictWriterによる書き込み

csv.DictWriter()を使用する場合、まずfieldnames引数にヘッダーとなるフィールド名をリストで指定します。そして、writeheader()メソッドでヘッダー行を書き込み、その後writerow()またはwriterows()で辞書形式のデータを書き込みます。

例:

import csv

data = [
{‘Name’: ‘Alice’, ‘Age’: ’30’, ‘City’: ‘New York’},
{‘Name’: ‘Bob’, ‘Age’: ’25’, ‘City’: ‘Los Angeles’}
]

fieldnames = [‘Name’, ‘Age’, ‘City’]

with open(‘output_dict.csv’, ‘w’, newline=”) as csvfile:
dict_writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
dict_writer.writeheader()
dict_writer.writerows(data)

CSVモジュールのその他の機能

csvモジュールには、他にも便利な機能があります。

区切り文字や引用符の指定

csv.reader()やcsv.writer()には、delimiter引数で区切り文字(デフォルトは’,’)を、quotechar引数で引用符(デフォルトは'”‘)を指定できます。これにより、タブ区切り(TSV)ファイルなど、様々な形式のCSVライクなファイルを扱うことができます。

インデント(スキップ)行の指定

skipinitialspace=Trueを指定すると、区切り文字の後に続く空白文字を無視します。

エラー処理

CSVファイルのパース中にエラーが発生した場合の挙動を制御するためのstrict引数などもあります。

Pandasライブラリとの連携

より高度なデータ分析や大規模なデータセットを扱う場合、pandasライブラリを使用するのが一般的です。pandasは、csvモジュールよりも高機能で、データフレームという強力なデータ構造を提供します。

PandasでのCSV読み込み

pandas.read_csv()関数を使用すると、CSVファイルを直接データフレームに読み込むことができます。この関数は、ヘッダーの自動検出、データ型の推論、欠損値の処理など、多くの便利な機能を備えています。

例:

import pandas as pd

df = pd.read_csv(‘sample.csv’)
print(df)

PandasでのCSV書き込み

データフレームをCSVファイルとして保存するには、DataFrame.to_csv()メソッドを使用します。

例:

df.to_csv(‘output_pandas.csv’, index=False)

index=Falseを指定することで、データフレームのインデックスをCSVファイルに書き込まないようにします。

まとめ

PythonでCSVファイルを扱うには、標準ライブラリのcsvモジュールが基本となります。これを使えば、CSVファイルの読み書きを簡単に行うことができます。特に、ヘッダー行がある場合はDictReaderとDictWriterが便利です。さらに高度なデータ操作や分析が必要な場合は、pandasライブラリのread_csv()とto_csv()が強力な選択肢となります。これらのツールを使い分けることで、効率的にCSVデータを扱うことができます。