PythonでCSVファイルを扱う

本物のページはこちら→csv

Included page "python:csv" does not exist (create it now)

まとめ

csvの要素を文字として扱いたいならcsvパッケージ
数値として扱いたいならnumpygenfromtxtあるいはrecfromcsv
を使うといい。

やり方

こういうcsvファイルを用意した

1,2,3
4,5,6

numpyを使う方法

genfromtxt

csvの中身を数値として扱いたいときにおすすめ

import numpy;
csvdata= numpy.genfromtxt('test.csv', delimiter=",",dtype='B')
for data in csvdata:
    print data;

出力結果
[1 2 3]
[4 5 6]

recfromcsv

なにがいいのかよくわからない。

import numpy;
csvdata=numpy.recfromcsv('test.csv', names=['a','a','a']);
for data in csvdata:
    print data;
(1, 2, 3)
(4, 5, 6)

しかし、1行に超いっぱい数値があるときはどうしたらいいんだろう。
import numpy;
csvdata=numpy.recfromcsv('test.csv',delimiter=',',dtype='B');
print csvdata;
出力結果

(4,5,6)

また、

csvdata=numpy.recfromcsv('test.csv',delimiter=',\n',dtype='B');

という風に、
カンマと改行で句切れと命令するとこういう出力結果になる

('4,5,6',)

csvモジュールを使う場合

import csv;
csvdata=csv.reader(open('test.csv', 'rb'), delimiter=',')
for data in csvdata:
   print data;

遭遇したエラー

ファイルが見つからない時のエラー

F:\sandbox\python>csv.py
Traceback (most recent call last):
  File "F:\sandbox\python\csv.py", line 2, in <module>
    csvdata=numpy.recfromcsv('japan.csv',delimiter=',\n',dtype='B');
  File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 1779, in recfromcsv
    output = genfromtxt(fname, **kwargs)
  File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 1241, in genfromtxt
    fhd = iter(np.lib._datasource.open(fname, 'rbU'))
  File "C:\Python27\lib\site-packages\numpy\lib\_datasource.py", line 145, in open
    return ds.open(path, mode)
  File "C:\Python27\lib\site-packages\numpy\lib\_datasource.py", line 479, in open
    raise IOError("%s not found." % path)
IOError: japan.csv not found.

recfromcsvの第2引数以降を何も指定せずに、for文でまわそうとしたとき

csvdata=numpy.recfromcsv('test.csv');
for data in csvdata:
    print data;
    for data in csvdata:
TypeError: iteration over a 0-d array

ファイル名をcsv.pyにしたときのエラー

import csv;
csvdata=csv.reader(open('test.csv', 'rb'), delimiter=',')
for data in csvdata:
    print data;

ファイル名がcsv.pyだとこんなエラーになります。
Traceback (most recent call last):
  File "F:\sandbox\python\csv.py", line 2, in <module>
    import csv;
  File "F:\sandbox\python\csv.py", line 4, in <module>
    csvdata=csv.reader(open('test.csv', 'rb'), delimiter=',')
AttributeError: 'module' object has no attribute 'reader'

なおすには、csv.py以外の名前にすること、
さらに、
できてしまった
csv.pycというファイルを消すこと。
です。

csvファイルを作るとき、うっかり行末にカンマを入れてしまった場合

こんなファイルを作ってしまったとする

1,2,3,
4,5,6,

すごくやっかいなことになります。
import numpy;
csvdata= numpy.genfromtxt('test.csv', delimiter=",",dtype='f')
for data in csvdata:
    print data;

floatで解釈すると、なにもないところはnanになります。
[  1.   2.   3.  nan]
[  4.   5.   6.  nan]

またunsigned charで解釈すると255になってしまいます

csvdata= numpy.genfromtxt('test.csv', delimiter=",",dtype='B')

[  1   2   3 255]
[  4   5   6 255]

csvパッケージだと、空の文字と解釈されます
import numpy;
import csv;
csvdata=csv.reader(file('test.csv', 'r'))
for data in csvdata:
    print data;
['1', '2', '3', '']
['4', '5', '6', '']

うっかり行末にカンマを入れてしまったcsvファイルを直すスクリプト

import csv;
csvdata=csv.reader(file('test.csv', 'r'))
 
csvwriter=csv.writer(open('out.csv', 'wb'), delimiter=',');
for data in csvdata:
    csvwriter.writerow(data[:3]);#最後の一個をなくす 3じゃ汎用性ないけど。。ww

サポートサイト Wikidot.com