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

PythonでCSVファイルを読み書きする方法|csvモジュールの基本を解説


CSV(Comma Separated Values:カンマ区切り値)形式は、表計算ソフトウェアで広く利用されている汎用的なデータ形式です。Pythonの標準ライブラリに含まれるcsvモジュールは、CSVファイルに対する読み書き操作を行うためのクラスとメソッドを提供しています。

writer()関数でCSVファイルに書き込む

csvモジュールのwriter()関数は、データを区切り文字入りの文字列に変換し、ファイルオブジェクトへ書き込むためのwriterオブジェクトを返します。この関数には、書き込み権限を持つファイルオブジェクトを引数として渡す必要があります。ファイルに書き込まれる各行には改行文字が付加されるため、行間に余分な空白行が挿入されるのを防ぐには、open()関数のnewlineパラメータに空文字列('')を指定します。

writerクラスには、以下の2つの主要なメソッドが用意されています。

writerow()

イテラブル(リスト、タプル、文字列など)内の要素をカンマで区切って、1行として書き込みます。

writerows()

イテラブルのリストを引数として受け取り、各要素をカンマ区切りの行としてファイルにまとめて書き込みます。

以下の例は、実際の書き込み手順を示したものです。まず「w」モードでファイルを開き、そこからwriterオブジェクトを取得します。続いて、タプルのリスト内の各タプルをwriterow()メソッドでファイルに書き込んでいます。

>>> import csv
>>> persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
>>> csvfile=open('persons.csv','w', newline='')
>>> obj=csv.writer(csvfile)
>>> for person in persons:
obj.writerow(person)
>>> csvfile.close()

このコードを実行すると、カレントディレクトリに「persons.csv」というファイルが作成され、中身は以下のようになります。

Lata,22,45
Anil,21,56
John,20,60

リストを1行ずつ反復処理して書き込む代わりに、writerows()メソッドを使えば、すべての行を一度に書き込むことができます。

>>> csvfile = open('persons.csv','w', newline='')
>>> obj = csv.writer(csvfile)
>>> obj.writerows(persons)
>>> csvfile.close()

reader()関数でCSVファイルを読み込む

reader()関数は、CSVファイル内の各行を順に返すイテレータであるreaderオブジェクトを返します。通常のforループを使えば、ファイル内のすべての行を簡単に表示できます。

>>> csvfile=open('persons.csv','r', newline='')
>>> obj=csv.reader(csvfile)
>>> for row in obj:
print (row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

readerオブジェクトはイテレータなので、組み込みのnext()関数を使って各行を1つずつ取り出すことも可能です。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.reader(csvfile)
>>> while True:
try:
row=next(obj)
print (row)
except StopIteration:
break

また、csvモジュールにはdialect(ダイアレクト)クラスが定義されています。ダイアレクトとは、CSVプロトコルを実装する際に用いられる一連の規格のことです。利用可能なダイアレクトの一覧は、list_dialects()関数で確認できます。

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

DictWriter()でヘッダー付きCSVを書き込む

DictWriter()関数はDictWriterオブジェクトを返します。writerオブジェクトと似ていますが、こちらは行を辞書(dict)オブジェクトとして扱える点が特徴です。この関数には、書き込み権限を持つファイルオブジェクトに加え、辞書のキー一覧をfieldnamesパラメータとして渡す必要があります。fieldnamesは、ファイルの1行目をヘッダーとして書き込む際にも使われます。

writeheader()

このメソッドは、辞書のキーのリストをカンマ区切りの1行として、ファイルの先頭行に書き込みます。

以下の例では、辞書を要素とするリストを定義し、writerows()メソッドを使ってカンマ区切り形式でファイルに書き込んでいます。

>>> persons=[{'name':'Lata', 'age':22, 'marks':45}, {'name':'Anil', 'age':21, 'marks':56}, {'name':'John', 'age':20, 'marks':60}]
>>> csvfile=open('persons.csv','w', newline='')
>>> fields=list(persons[0].keys())
>>> obj=csv.DictWriter(csvfile, fieldnames=fields)
>>> obj.writeheader()
>>> obj.writerows(persons)
>>> csvfile.close()

作成されたファイルの内容は以下の通りです。

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader()で辞書形式のCSVを読み込む

DictReader()関数は、対象のCSVファイルからDictReaderオブジェクトを返します。readerオブジェクトと同様にイテレータとして動作し、これを使ってファイルの内容を取得できます。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.DictReader(csvfile)

DictReaderクラスにはfieldnames属性があり、ファイルのヘッダーとして使われているキーの一覧を取得できます。

>>> obj.fieldnames
['name', 'age', 'marks']

DictReaderオブジェクトをforループで回すことで、行ごとの辞書オブジェクトを1つずつ取得できます。

>>> for row in obj:
print (row)

実行結果は以下のようになります。

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

OrderedDictオブジェクトを通常の辞書に変換したい場合は、collectionsモジュールからOrderedDictをインポートして、dict()関数を使います。

>>> from collections import OrderedDict
>>> r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
>>> dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

なお、Python 3.8以降ではDictReaderが通常のdictオブジェクトを返すように変更されたため、この変換は不要になっています。

本記事では、Pythonのcsvモジュールを使ったCSVファイルの読み書き方法について、基本的な機能を中心に解説しました。


  1. Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法

    大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy

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

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