PythonでCSVを操作する方法を初心者向けに解説


PythonでCSVを操作する方法を初心者向けに解説

機械学習やデータ分析を行う上で欠かせない「データの読み込み」。
またマーケティングや情報収集で役立つWebスクレイピングからの「データ保存」。
これらのデータ媒体によく「CSVファイル」使われますよね。
今回は、Pythonを使った「CSVデータの読み込み方」「CSVファイルへの書き込み方」をご紹介します。

目次
  1. CSVデータの読み込み
  2. ローカル環境下のCSVファイルを読み込み
  3. ローカル環境下のCSVをpandasを使って読み込み
  4. ローカル環境下のCSVをNumpyを使って読み込み
  5. URLからCSVを読み込み
  6. ライブラリ(Scikit-learn)からデータセットを読み込み
  7. ライブラリ(seaborn)からデータセットを読み込み
  8. CSVデータの書き込み、保存
  9. Pythonで新規CSVファイルを作成
  10. Pythonを使ってCSVファイルへデータ入力
  11. データを追加
  12. 違う追加方法
  13. 上書き
  14. <<実践的な例>> Webスクレイピング
  15. まとめ

CSVデータの読み込み

image

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)

<< 結果 >>

python-open()

<< 説明 >>

こちらは基本的なCSVファイルの読み込み方法で、Pythonに標準搭載されているCSVライブラリを利用(import csv)。変数 csvfileopen関数 で開く CSV ファイルを割当。そして reader() 関数でCSVデータの各行を読み込み、出力。for文を使うことで最終行までデータ読み込みを可能にしています。

ローカル環境下のCSVをpandasを使って読み込み

import pandas as pd
df = pd.read_csv('water.csv')
print(df)

<< 結果 >>

python-open()

<< 説明 >>

データ解析用ライブラリとして有名な 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のデータ構造が悪い

<< エラーの内容確認 >>

image

CSVファイルを開いてよく見てみると、行末のセル設定が不揃い。行末のデータは、計算上必要ないので削除して、再実行。

<< エラー対応後の結果 >>

image

<< 説明 >>

CSVデータを整形することで、データ読み込みが完了。

ローカル環境下のCSVをNumpyを使って読み込み

import numpy
filename = 'water-no-head.csv'
raw_data = open(filename, 'r')
data = numpy.loadtxt(raw_data, delimiter=",")
print(data)

<< 結果 >>

python-open()

<< 説明 >>

数値計算用のライブラリ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()

<< 結果 >>

python-open()

<< 説明 >>

通常は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)

<< 結果 >>

python-open()

<< 説明 >>

機械学習でよく使われる 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)

<< 結果 >>

python-open()

<< 説明 >>

先ほどの Scikit-learn 同様、ライブラリ seaborn でも iris の CSVデータをシンプルに読み込むことが可能です。作業工程は、最初の行 import seaborn.apionly as sns でデータセットを読み込む準備をして、2行目の load_dataset() 関数の引数に 'iris' を割り当てることで iris の CSVデータ を用意。そしてそのデータを変数 irir に代入し、print()処理。Scikit-learn同様、シンプルでいいですね。



CSVデータの書き込み、保存

image

CSVデータの書き込み方、保存方法を以下の3つの方法でご紹介します。

  • CSVファイルの作成
  • 変数機能を使ったCSVデータの書き込み
  • リスト機能を使ったCSVデータの書き込み

Pythonで新規CSVファイルを作成

open('person.csv', 'w') 
pass

<< 結果 >>

image

<< 説明 >>

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()

<< 結果 >>

image

<< 説明 >>

こちらでは 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()

<< 結果 >>

image

<< 説明 >>

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()

<< 結果 >>

image

<< 説明 >>

先程までは入力データを変数NameCity に代入して処理していました。今回は、リスト機能を使ってデータ入力してみます。入力データを [' デニー', 'ニューヨーク'] とリスト形式で記述し、変数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()

<< 結果 >>

image

<< 説明 >>

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])

<< 結果 >>

image

<< 説明 >>

こちらの例では CSV 機能の知識とスクレイピングの BeautifulSoup に関する知識、それからHTML・CSSに関する知識が必要でしょう。オークションサイト「モバオク」のキーワード検索結果の一覧を CSVファイル に書き込んでいますね。

AIエンジニアに必要なスキルが身に付く

無料カウンセリングはこちら

まとめ

自分でクリックしたり入力したりする CSV ファイルの操作に比べて、Pythonで CSV を操作しようと思うといろいろ細かい知識も必要かもしれません。しかし、Pythonで CSV を扱えるようになると、データ解析、データマネジメントの面でワンランク上にいくこと間違いないでしょう。

CSV以前に「Pythonの実行方法が分からない」「関数や引数ってナニ?」という方、Pythonの基礎から学習してみませんか?一見遠回りに見えそうな基礎学習、実は最短でPythonを理解・習得する道かもしれませんよ。CodeCampでは「オンライン × マンツーマン」で忙しいあなたを学習サポートします。


<< 今回ご紹介したライブラリの公式ページ一覧 >>


オシママサラ
この記事を書いた人
オシママサラ
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp