Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでCSVファイルを読み書きする方法|csvモジュールとPandasの使い方を徹底解説

この記事では、Pythonを使ってCSVファイルを読み書きする方法を解説します。標準ライブラリのcsvモジュールと、データ分析に広く使われているPandasの両方のアプローチを、実際のコード例とともに紹介します。

csvモジュールでCSVファイルを読み込む

まずは標準ライブラリのcsvモジュールを使う基本的な方法です。以下のコードでは、orders.csvというファイルを読み込み、1行ずつデータを処理しています。

import csv

f = open("orders.csv", "rt")
orders = csv.reader(f)
for order in orders:
    print(order)
f.close()

readerメソッドは、各行をリストとして返します。実行結果は次のようになります。

['OrderID', 'CustomerID', 'OrderDate']
['10248', '4', '10/02/2020']
['10249', '2', '10/02/2020']
['10250', '7', '10/02/2020']

補足:with文で安全にファイルを開く

上記の例のようにopen()close()を明示的に呼び出すこともできますが、with文を使えば処理終了後に自動的にファイルが閉じられるため、より安全で推奨される書き方です。

import csv

with open("orders.csv", "rt") as f:
    orders = csv.reader(f)
    for order in orders:
        print(order)

DictReaderで辞書形式として読み込む

DictReaderメソッドを使用すると、CSVファイルの各行が辞書(dict)として読み込まれます。このとき、先頭行の列見出し(ヘッダー)がキーとして自動的に割り当てられるため、列名を指定して値へアクセスできるのが大きなメリットです。

import csv

orders = csv.DictReader(open("orders.csv"))
for order in orders:
    print(order)

実行結果:

{'OrderID': '10248', 'CustomerID': '4', 'OrderDate': '10/02/2020'}
{'OrderID': '10249', 'CustomerID': '2', 'OrderDate': '10/02/2020'}
{'OrderID': '10250', 'CustomerID': '7', 'OrderDate': '10/02/2020'}

PandasでCSVファイルを読み込む

Pandasを使うと、わずか数行のコードでCSVを表形式のデータ(DataFrame)として扱えます。まずPandasライブラリをインストールしておきましょう。

インストールは次のコマンドを実行します:pip3 install pandas

import pandas

orders = pandas.read_csv('orders.csv')
print(orders)

実行結果:

OrderID  CustomerID   OrderDate
10248           4     10/02/2020
10249           2     10/02/2020
10250           7     10/02/2020

read_csv()は自動的にヘッダー行を認識し、各列に適切なデータ型を推定してくれるため、集計やフィルタリングといった後続のデータ処理にもそのまま活用できます。

PandasでCSVファイルに書き込む

DataFrameを作成し、to_csv()メソッドを呼ぶだけでCSVファイルとして保存できます。index=Falseを指定すると、行番号のインデックス列が出力されなくなります。

from pandas import DataFrame
import pandas as pd

order = pd.DataFrame({'OrderID': ['10251', '10252', '10253'],
                   'CustomerID': ['5', '1', '8'],
                   'OrderDate': ['11/02/2020', '11/02/2020', '11/02/2020']})
order.to_csv('newOrders.csv', index=False)

出力されたnewOrders.csvの中身:

OrderID,CustomerID,OrderDate
10251,5,11/02/2020
10252,1,11/02/2020
10253,8,11/02/2020

既存のCSVファイルにデータを追記する

to_csv()のデフォルトの書き込みモードは'w'(上書き)です。既存のCSVファイルにデータを追加したい場合は、追記モードであるmode='a'を指定します。また、ヘッダー行を重複して書き込まないよう、header=Falseも忘れずに設定しましょう。

from pandas import DataFrame
import pandas as pd

order = pd.DataFrame({'OrderID': ['10254'],
                   'CustomerID': ['3'],
                   'OrderDate': ['11/02/2020']})
order.to_csv('newOrders.csv', mode='a', index=False, header=False)

追記後のnewOrders.csvの中身:

OrderID,CustomerID,OrderDate
10251,5,11/02/2020
10252,1,11/02/2020
10253,8,11/02/2020
10254,3,11/02/2020

csvモジュールでCSVファイルに書き込む

次に、標準ライブラリのcsvモジュールを使った書き込み方法です。最初の行は列ヘッダーとして書き込んでいます。

import csv
with open('orders.csv', 'w', newline='') as file:
    order = csv.writer(file)
    order.writerow(['OrderID', 'CustomerID', 'OrderDate'])
    order.writerow(['10251', '6', '11/02/2020'])
    order.writerow(['10252', '9', '11/02/2020'])
    order.writerow(['10253', '5', '11/02/2020'])

出力されたorders.csvの中身:

OrderID,CustomerID,OrderDate
10251,6,11/02/2020
10252,9,11/02/2020
10253,5,11/02/2020

なお、Windows環境で余計な空行が挿入されるのを防ぐため、open()にはnewline=''を指定するのがポイントです。

csvモジュールで既存ファイルに追記する

csvモジュールで既存のCSVファイルに追記する場合は、open()メソッドに'a'(追記モード)を渡します。このとき、すでに存在するヘッダー行はスキップしてください。

例:

with open('orders.csv', 'a', newline='') as file:
    order = csv.writer(file)
    order.writerow(['10251', '6', '11/02/2020'])

DictWriterでCSVファイルに書き込む

csvクラスのDictWriterメソッドを使えば、辞書形式のデータを直接CSVファイルに書き込めます。事前にfieldnames引数で列名の一覧を定義し、writeheader()でヘッダー行を出力するのが基本の流れです。

import csv
with open('orders.csv', 'w', newline='') as file:
    fieldnames = ['OrderID', 'CustomerID', 'OrderDate']
    order = csv.DictWriter(file, fieldnames=fieldnames)
    order.writeheader()
    order.writerow({'OrderID': '10251', 'CustomerID': 7, 'OrderDate': '11/02/2020'})
    order.writerow({'OrderID': '10252', 'CustomerID': 3, 'OrderDate': '11/02/2020'})
    order.writerow({'OrderID': '10253', 'CustomerID': 1, 'OrderDate': '11/02/2020'})

出力されたorders.csvの中身:

OrderID,CustomerID,OrderDate
10251,7,11/02/2020
10252,3,11/02/2020
10253,1,11/02/2020

まとめ

PythonでのCSV操作は、用途によって使い分けるのがおすすめです。

  • シンプルな読み書き:標準ライブラリのcsvモジュール(reader / writer
  • 列名でアクセスしたい場合DictReader / DictWriter
  • 集計・分析・大量データの処理:Pandasのread_csv() / to_csv()

いずれの場合も、既存ファイルへの追記時は'a'モードとヘッダーの扱いに注意することを覚えておきましょう。

  1. PythonでPDFをCSVに変換する方法|tabula-pyの使い方を徹底解説

    Pythonは、膨大なパッケージライブラリを擁することで広く知られています。本記事では、これらのライブラリを活用して、PDFファイルをCSVファイルへ変換する方法を詳しく解説します。CSVファイルとは、行と列という形式で整理されたデータの集合体のことです。PythonのライブラリにはPDFをCSVに変換できるパッケージが複数存在しますが、ここではtabula-pyモジュールを使用します。tabula-pyの主要部分はJavaで実装されており、まずPDFドキュメントを読み込み、その内容をPythonのDataFrame、さらにJSONオブジェクトへと変換する仕組みになっています。tabula-p

  2. PythonのopenpyxlモジュールでExcelファイルを読み書きする方法【初心者向け完全ガイド】

    Pythonには、Excelファイル(.xlsx)を操作するためのopenpyxlという便利なモジュールが用意されています。このモジュールを使えば、Excelファイルの新規作成、データの書き込み・読み取り、シートの追加や管理など、さまざまな操作をプログラムから自動的に行うことができます。 本記事では、openpyxlの基本的な使い方を、実際に動作するサンプルコードとともに順番に解説していきます。 openpyxlのインストール方法 openpyxlは標準ライブラリではないため、まずインストールが必要です。コマンドプロンプト(またはターミナル)で以下のコマンドを実行してください。 pip ins