PythonでCSVファイルを読み書きする方法
PythonでCSVファイルを簡単に読み書きすることができます。普通にファイルをオープンして、splitで頑張る方法もありますが、力技に頼る必要はありません。
読み方
- CSV
- しーえすぶい
目次
概要
PythonでCSVファイルを読み込む方法がいくつかあります。自分でパースする方法もありますが、プログラミングの目的は、たいていの場合、CSVファイルのパースのコードを書くためではありません。集計や統計などが目的であれば、CSVを簡単に扱うモジュールを使うのが望ましいでしょう。
CSVを扱うモジュール
- csv
- pandas
csvモジュールで1行目をスキップする方法
next を使用して、1行目をスキップできます。
import csv csvfile = 'csv1.csv' f = open(csvfile, "r") reader = csv.reader(f) header = next(reader)
単純なCSVファイルの読み込み
csv1.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 import csv csvfile = 'csv1.csv' f = open(csvfile, "r") reader = csv.reader(f) # header = next(reader) for row in reader: print row f.close()
csv1.csv
1,"foo" 2,"bar" 3,"hoge"
実行例
$ python csv1.py ['1', 'foo'] ['2', 'bar'] ['3', 'hoge']
単純なCSVファイルの読み込み 要素にアクセスする
csv2.py
rowは配列なので、添字を指定して、要素にアクセスできます。
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 import csv csvfile = 'csv1.csv' f = open(csvfile, "r") reader = csv.reader(f) # header = next(reader) for row in reader: print row[1] f.close()
実行例
$ python csv2.py foo bar hoge
Unixパスワードファイルの読み込み /etc/passwd
Unix(Linux,FreeBSD)の/etc/passwdファイルは、CSVファイルではありません。/etc/passwdは、コロン区切りのファイルです。
ソースコード csv3_pw.py
FreeBSDの/etc/passwdは、2行目までがコメントのため、スキップしています。Ubuntuの場合は、 next の行を省略してください。 この例では、 /etc/passwd のユーザ名だけを表示します。
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2015 kaoru <kaoru@bsd> import csv csvfile = '/etc/passwd' f = open(csvfile, "r") reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE) header = next(reader) # FreeBSDは、必要。 Ubuntuでは不要 header = next(reader) # FreeBSDは、必要。 Ubuntuでは不要 for row in reader: print row[0] f.close()
実行例
root toor daemon operator bin tty kmem games news man sshd smmsp mailnull bind unbound proxy _pflogd _dhcp uucp pop auditdistd www hast nobody user git_daemon
CSVファイルを書き込む簡単な例
PythonでCSVファイルを書き出す例です。
ソースコード csv_writer1.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2015 kaoru <kaoru@bsd> import csv data = [[1, 'foo'], [2, 'bar'], [3, 'hoge']] f = open('write1.csv', 'w') writer = csv.writer(f) writer.writerows(data) f.close()
実行例
$ python csv_wr ter1.py
以下の内容のファイルが作成されます。
1,foo 2,bar 3,hoge
pandasを使用したCSVの読み込み
pandas を使用すると非常に簡単になります。
モジュールのインストール
sudo pip install numpy sudo pip install pandas
ソースコード pandas1.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2015 kaoru <kaoru@bsd> import pandas csv = pandas.read_csv('csv2.csv') print csv
csv2.csv
"No","Name" 1,"foo" 2,"bar" 3,"hoge"
実行例
No Name 0 1 foo 1 2 bar 2 3 hoge
pandasを用いてCSVファイルのカラムを指定して表示する
ソースコード pandas2.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2015 kaoru <kaoru@bsd> import pandas csv = pandas.read_csv('csv2.csv') print csv['Name']
実行例
0 foo 1 bar 2 hoge Name: Name, dtype: object
Excelで開いたら文字化け
UTF-8 で書き込んでしまったら、Excel で開くと文字化けになってしまいました。 SJISで書き込む必要があるようです。
UTF-16 で書き込むと、本来であれば、複数の列にわかれて、値が表示される想定でしたが、なぜか、セルがまとまってしまいました。
Excelで開いたらセルがわかれない
Python で作った CSV ファイルをExcel(エクセル)で開くと、本来であれば、複数のセルにわかれて表示されるつもりだったが、1つのセルにまとまって表示されてしまう場合には、方言設定を excel に設定しなければならないかもしれません。
import csv f = open("file.csv", "w", encoding="SJIS") w = csv.writer(f, dialect="excel") w.writerow(["foo", "日本"]) w.writerow(["bar", "米国"]) f.close()
関連項目
- Pythonでファイルを読む方法
- Pythonで標準入力から読み込む方法
- Pythonでパスからファイル名を取得する (os.path.basename)
- Pythonでファイル名から拡張子を取得する
ツイート