「PythonでCSVファイルを読み書きする方法」の版間の差分

提供: Python入門
移動: 案内検索
(ページの作成:「PythonでCSVファイルを簡単に読み書きすることができます。普通にファイルをオープンして、splitで頑張る方法もありますが、力...」)
 
 
行214: 行214:
 
2    hoge
 
2    hoge
 
Name: Name, dtype: object
 
Name: Name, dtype: object
 +
</syntaxhighlight>
 +
== Excelで開いたら文字化け ==
 +
UTF-8 で書き込んでしまったら、Excel で開くと文字化けになってしまいました。
 +
SJISで書き込む必要があるようです。
 +
 +
UTF-16 で書き込むと、本来であれば、複数の列にわかれて、値が表示される想定でしたが、なぜか、セルがまとまってしまいました。
 +
== Excelで開いたらセルがわかれない ==
 +
Python で作った CSV ファイルをExcel(エクセル)で開くと、本来であれば、複数のセルにわかれて表示されるつもりだったが、1つのセルにまとまって表示されてしまう場合には、方言設定を excel に設定しなければならないかもしれません。
 +
<syntaxhighlight lang="python">
 +
import csv
 +
f = open("file.csv", "w", encoding="SJIS")
 +
w = csv.writer(f, dialect="excel")
 +
w.writerow(["foo", "日本"])
 +
w.writerow(["bar", "米国"])
 +
f.close()
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== 関連項目 ==
 
== 関連項目 ==

2018年5月29日 (火) 22:10時点における最新版

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

関連項目