- 公開日: 2018年07月25日
PythonでCSVを操作する方法を初心者向けに解説
機械学習やデータ分析を行う上で欠かせない「データの読み込み」。
またマーケティングや情報収集で役立つWebスクレイピングからの「データ保存」。
これらのデータ媒体によく「CSVファイル」使われますよね。
今回は、Pythonを使った「CSVデータの読み込み方」「CSVファイルへの書き込み方」をご紹介します。
CSVデータの読み込み
CSVデータの読み込み、といってもその方法はいろいろ。 今回は以下の6つの方法をコードメインでご紹介します。
- ローカル環境下のCSVを読み込み
- ローカル環境下のCSVをpandasを使って読み込み
- ローカル環境下のCSVをNumpyを使って読み込み
- URLからCSVを読み込み
- ライブラリ(scikitlearn)からデータセットを読み込み
- ライブラリ(seaborn)からデータセットを読み込み
ローカル環境下のCSVファイルを読み込み
import csv
csvfile = open('water.csv')
for row in csv.reader(csvfile):
print(row)
<< 結果 >>
<< 説明 >>
こちらは基本的なCSVファイルの読み込み方法で、Pythonに標準搭載されているCSVライブラリを利用(import csv
)。変数 csvfile
に open
関数 で開く CSV ファイルを割当。そして reader()
関数でCSVデータの各行を読み込み、出力。for
文を使うことで最終行までデータ読み込みを可能にしています。
ローカル環境下のCSVをpandasを使って読み込み
import pandas as pd
df = pd.read_csv('water.csv')
print(df)
<< 結果 >>
<< 説明 >>
データ解析用ライブラリとして有名な pandas を使って、CSVデータを読み込むパターンです。最初に pandas を読み込み(import pandas as pd
)、次にpandas内に用意されているCSV読み込み機能 read_csv
関数を利用。その read_csv(water.csv)
で読み込んだデータを 変数 df
に代入して、最終的にprint
処理。先ほどのCSVライブラリに比べて for
などがなくスッキリしたコードになる特徴がありますね。
しかし、結果はエラー。
【エラー文】
ParserError: Error tokenizing data. C error: Expected 2 fields in line 82, saw 3
要は、CSVのデータ構造が悪い
<< エラーの内容確認 >>
CSVファイルを開いてよく見てみると、行末のセル設定が不揃い。行末のデータは、計算上必要ないので削除して、再実行。
<< エラー対応後の結果 >>
<< 説明 >>
CSVデータを整形することで、データ読み込みが完了。
ローカル環境下のCSVをNumpyを使って読み込み
import numpy
filename = 'water-no-head.csv'
raw_data = open(filename, 'r')
data = numpy.loadtxt(raw_data, delimiter=",")
print(data)
<< 結果 >>
<< 説明 >>
数値計算用のライブラリNumpyを使ってCSVファイルを読み込むパターンをご紹介。Numpyを使ってCSVファイルを読み込む場合、データを数字(数値)だけにした方が、処理がシンプル。数値と文字列が混ざったCSVデータの場合、以下のようなエラーが。
ValueError: could not convert string to float: b'Year'
読み込むCSVファイルを先程まで使っていた、water.csv や water_2.csv で実行するとエラーになります。
それでコードについて順を追って説明すると、最初の import numpy
で Numpyライブラリを読み込み、読み込み対象の CSVファイル を変数 filename
に代入。そして open()
関数で変数 filename
を読み込み。このとき open()
関数内に 'r'
と書くことで読み込みを指示。その結果を変数 raw_data
に代入。そしてnumpyに装備されている loadtxt()
関数を使って各行のデータを読み込み。 loadtxt()
内の delimiter=","
は、データの区切りを指示。通常 CSVデータは、 ,
でデータが区切られていますので上記のようなコードに。
今回はCSVデータを出力していますが、print(data)
を print(data.shape)
に変更するとCSVファイルのデータ構造(行・列)を表示できます。
(( Numpyに搭載されているデータ加工機能の例 ))
- data.shape/ データ構造
- data.dtype / データタイプの確認
- data.astype(str) / データタイプの変更、str や int などに。
- data.sum() / 足し算に
URLからCSVを読み込み
import matplotlib.pyplot as plt
import pandas
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
data.plot(kind='density', subplots=True, layout=(3,3), sharex=False)
plt.show()
<< 結果 >>
<< 説明 >>
通常はCSVデータをローカル環境に用意して分析やデータ処理を行うと思いますが、時にはWeb上のCSVデータを活用したい時もあるでしょう。そんなURLからCSVデータを読み込む方法をこちらでご紹介。ちなみに今回は糖尿病の発症に関するデータをWeb上から読み込んでみます。
WebからCSVを読み込む方法はいくつかありますが、ライブラリ Pandas を使った例がシンプル。
Web上のCSVアドレスを変数url
に代入し、read_csv()
関数で読み込むことでCSVデータを活用可能。上記コードではプロットライブラリの Matplotlib を使って、データを可視化(data.plot()
関数)しています。
ライブラリ(Scikit-learn)からデータセットを読み込み
from sklearn.datasets import load_iris
data = load_iris()
print(data)
<< 結果 >>
<< 説明 >>
機械学習でよく使われる iris のデータセット。ライブラリ Scikit-learn を使う場合はわざわざ irisの CSVファイルを用意しなくても、ライブラリ内のデータセットを活用可能。最初の from sklearn.datasets import load_iris
で iris のデータを読み込み、変数 data
に代入。非常にシンプルに iris の CSV データを読み込めていますね。
ライブラリ(seaborn)からデータセットを読み込み
import seaborn.apionly as sns
iris = sns.load_dataset('iris')
print(iris)
<< 結果 >>
<< 説明 >>
先ほどの Scikit-learn 同様、ライブラリ seaborn でも iris の CSVデータをシンプルに読み込むことが可能です。作業工程は、最初の行 import seaborn.apionly as sns
でデータセットを読み込む準備をして、2行目の load_dataset()
関数の引数に 'iris'
を割り当てることで iris の CSVデータ を用意。そしてそのデータを変数 irir
に代入し、print()
処理。Scikit-learn同様、シンプルでいいですね。
CSVデータの書き込み、保存
CSVデータの書き込み方、保存方法を以下の3つの方法でご紹介します。
- CSVファイルの作成
- 変数機能を使ったCSVデータの書き込み
- リスト機能を使ったCSVデータの書き込み
Pythonで新規CSVファイルを作成
open('person.csv', 'w')
pass
<< 結果 >>
<< 説明 >>
CSVファイルを作るだけなら impot csv
なしの open()
関数だけでOK。単にファイルを作成するだけなら open('person.csv', 'x')
と記述することも可能。
Pythonを使ってCSVファイルへデータ入力
import csv
Name = 'ジョージ'
City = 'ハワイ'
with open('person.csv', 'w') as csvFile:
writer = csv.writer(csvFile)
writer.writerow([Name, City])
csvFile.close()
<< 結果 >>
<< 説明 >>
こちらでは Python を使って CSV ファイル内にデータを入力しています。冒頭の import csv
で CSV機能を読み込み、今回は名前(Name
)と住所(City
)を入力。
先ほど作ったカラの CSVファイル を書き込み先として with open('person.csv', 'w') as csvFile:
で呼び出し。あとは writer()
関数で書き込み先ファイルを変数 writer
に代入して、 writerow()
関数で CSVファイルの行に書き込み実施。
最後に close()
関数で閉じて終了です。
データを追加
import csv
Name = 'スティーブ'
City = 'テキサス'
with open('person.csv', 'a') as csvFile:
writer = csv.writer(csvFile)
writer.writerow([Name, City])
csvFile.close()
<< 結果 >>
<< 説明 >>
CSVファイルの行末にデータを追加する場合は、 open()
関数の引数に 'a'
を使用します。先ほどの入力のケースとほとんど同じコードですが、 open()
関数の引数が 'w'
でなく 'a'
になっていますね。
違う追加方法
import csv
row = [' デニー', 'ニューヨーク']
with open('person.csv', 'a') as csvFile:
writer = csv.writer(csvFile)
writer.writerow(row)
csvFile.close()
<< 結果 >>
<< 説明 >>
先程までは入力データを変数Name
と City
に代入して処理していました。今回は、リスト機能を使ってデータ入力してみます。入力データを [' デニー', 'ニューヨーク']
とリスト形式で記述し、変数row
に代入。あとは writerow()
関数の引数に先ほどの row
を入力。CSVファイルへのデータ入力の一例としてご紹介させて頂きました。
上書き
import csv
row = ['ダース', 'カルフォルニア']
with open('person.csv', 'r') as readFile:
reader = csv.reader(readFile)
lines = list(reader)
lines[2] = row
with open('person.csv', 'w') as writeFile:
writer = csv.writer(writeFile)
writer.writerows(lines)
readFile.close()
writeFile.close()
<< 結果 >>
<< 説明 >>
CSVファイル内のデータを上書きしたい場合は、 with open('person.csv', 'r') as readFile:
で上書きしたいファイルを指定して、 lines[2] = row
で上書きポイントを特定。
あとは with open('person.csv', 'w') as writeFile:
以下で書き込み処理を実行。最後に読み込み、書き込み共に close()
処理します。
<<実践的な例>> Webスクレイピング
これまでCSVファイルの読み込み方、書き込み方をご紹介してきましたが、チョット実際に役立ちそうなプログラムも実行してみたいですよね。参考までに以下に Webスクレイピング から得たデータを CSV ファイルに書き込み・保存する例をご紹介。
import csv
import requests
from bs4 import BeautifulSoup
mobaoku_html = requests.get('https://www.mbok.jp/_l?at=all&sel-cat=900000000&c=900000000&cp1=&cp2=&ic=1&ss=1&_CODE=%82%A0&vt=0&r=fl&m=&o=&fc=&ls_exec=1&mem=1&q=%8F%C1%96h')
soup = BeautifulSoup(mobaoku_html.text, "html.parser")
with open('mobaoku.csv', 'wt') as fw:
writer = csv.writer(fw, lineterminator='\n')
writer.writerow(['name', 'price'])
for i in soup.select('div.row-single > ul > li'):
name = i.select_one('h2.title > a > span').get_text().strip()
price = ''.join(i.select_one('div.item-main-info > p > span').get_text().split())
writer.writerow([name, price])
<< 結果 >>
<< 説明 >>
こちらの例では CSV 機能の知識とスクレイピングの BeautifulSoup に関する知識、それからHTML・CSSに関する知識が必要でしょう。オークションサイト「モバオク」のキーワード検索結果の一覧を CSVファイル に書き込んでいますね。
\AIエンジニアに必要なスキルが身に付く/
まとめ
自分でクリックしたり入力したりする CSV ファイルの操作に比べて、Pythonで CSV を操作しようと思うといろいろ細かい知識も必要かもしれません。しかし、Pythonで CSV を扱えるようになると、データ解析、データマネジメントの面でワンランク上にいくこと間違いないでしょう。
CSV以前に「Pythonの実行方法が分からない」「関数や引数ってナニ?」という方、Pythonの基礎から学習してみませんか?一見遠回りに見えそうな基礎学習、実は最短でPythonを理解・習得する道かもしれませんよ。CodeCampでは「オンライン × マンツーマン」で忙しいあなたを学習サポートします。
<< 今回ご紹介したライブラリの公式ページ一覧 >>
- この記事を書いた人
- オシママサラ