環境
バージョン
$ python --version
Python 2.7.12 :: Continuum Analytics, Inc.
$ pip freeze | grep pandas
pandas==0.19.1
サンプルファイル
$ file --mime sample.tsv
sample.tsv: text/plain; charset=utf-8
$ cat sample.tsv
ID 言語
1 日本語
2 英語
codecs
まず codecs
ですが
>>> open("sample.tsv", "r").read()
'ID\t\xe8\xa8\x80\xe8\xaa\x9e\n1\t\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\n2\t\xe8\x8b\xb1\xe8\xaa\x9e\n'
>>> import codecs
>>> codecs.open("sample.tsv", "r", "utf-8").read()
u'ID\t\u8a00\u8a9e\n1\t\u65e5\u672c\u8a9e\n2\t\u82f1\u8a9e\n'
codecs
で読み込むと unicode
にしてくれます。
pandas
tsv
を読み込む時に便利な read_table
関数。
>>> import pandas as pd
>>> df = pd.read_table(open("sample.tsv", "r"))
>>> df
ID 言語
0 1 日本語
1 2 英語
>>> df.columns
Index([u'ID', u'言語'], dtype='object')
>>> df[u"言語"]
Traceback (most recent call last):
...
KeyError: u'\u8a00\u8a9e'
>>> list(df.columns)
['ID', '\xe8\xa8\x80\xe8\xaa\x9e']
>>> type(list(df.columns)[1])
<type 'str'>
>>> df["言語"]
0 日本語
1 英語
Name: 言語, dtype: object
df.columns
の表示に u
が着いてるのはよくわかりませんが、
文字列の型が str
なのは納得ですね。
codecs & pandas
with read_table
では codecs
を使って read_table
で読み込むと
>>> df = pd.read_table(codecs.open("sample.tsv", "r", "utf-8"))
>>> df
ID 言語
0 1 日本語
1 2 英語
>>> df[u"言語"]
Traceback (most recent call last):
...
KeyError: u'\u8a00\u8a9e'
>>> df["言語"]
0 日本語
1 英語
Name: 言語, dtype: object
なぜか str
になるみたいです。
without read_table
>>> from collections import defaultdict
>>> data = defaultdict(list)
>>> f = codecs.open("sample.tsv", "r", "utf-8")
>>> labels = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> values = f.readline()[:-1].split("\t") # 改行以外をタブで分割
>>> for label, value in zip(labels, values):
... data[label].append(value)
...
>>> df = pd.DataFrame(data)
>>> df
ID 言語
0 1 日本語
>>> df["言語"]
Traceback (most recent call last):
...
KeyError: '\xe8\xa8\x80\xe8\xaa\x9e'
>>> df[u"言語"]
0 日本語
Name: 言語, dtype: object
>>> list(df.columns)
[u'ID', u'\u8a00\u8a9e']
>>> type(list(df.columns)[1])
<type 'unicode'>
read_table
を使わずに
codecs
で読み込んだ場合は、
想定通りでした。