Pythonでcsvファイルやtsvファイルを開くときは、Pandasのpd.read_csv()やpd.read_table()を使うことが多いかと思います。
ここでは、Pandasではなくopen関数を使ってファイルを開く方法について説明します。
方法は①と②がありますが、②の方が確実です。理由は後述します。
open関数の使い方について理解を深めたいなら①も読んで頂ければと思います。open関数はcsvやtsvのようなデータファイルだけでなくtxtのような文章も読み込めますので、文章解析のときに重宝する関数ですので、覚えておいて損はありません。
そもそも、どういう場面でopen関数を使うのか
Pandasを使わない場合です。リストを作って、それをNumpyのarrayに変換して機械学習にかけるようなケースです。
kaggleやsignateでは、csvやtsvファイルをPandasで開いてから機械学習にかける例が多いため、この書き方はあまり見ないかと思います。
視認性がよかったり、グラフを書いて可視化するような場合はPandasを使って読んだ方がよいかと思います。
Numpyの方が扱いやすい方は、以下に説明する方法を用いればよいかと思います。
方法①
csvファイルやtsvファイルが同じパスにある場合、まずはopen関数でファイルを開き、fという変数に代入します。
次に、fに代入したファイルの中身を出力します。
例えば、oishi_gurume.csvという名前のファイルがあったとします。
1)最初から最後までを1つのかたまりで出力する
with open('./oishi_gurume.csv') as f:
hyou = f.read()
hyou
‘○○,△△,□□,◇◇\n●●,▲▲,■■,◆◆\n・・・’
ひとかたまりの文字列として出力されます。1行目と2行目の間など、改行されるところは、改行を意味する\nが埋め込まれた状態になります。tsvの場合は\tです。
※余談ですが、変数hyouの名前の由来は、「表」のローマ字読みからきています。
2)1行を1つのかたまりで出力する
with open('./oishi_gurume.csv') as f:
gyous = f.read().split('\n')
gyous
[‘○○,△△,□□,・・・,◇◇’,’●●,▲▲,■■,◆◆’, ・・・]
行ごとにひとかたまりになって取り出されているのが分かります。\nはなくなっています。
こういう書き方もできます。
with open('./oishi_gurume.csv') as f:
gyous = f.readlines()
gyous
※余談ですが、変数gyousの名前の由来は、「行」の複数形(gyou + s)という意味からです。
3)1要素ずつ出力する
やりたいのはこれです。
hyou= []
with open('./oishi_gurume.csv') as f:
gyous = f.read().split('\n')
for gyou in gyous:
if gyou == gyous[0]:
header = gyou.split(',')
else:
gyou = gyou.split(',')
hyou.append(gyou)
これで、ヘッダー(カラム名)がheaderというリストに、それ以外がhyouというリストに収まりました。tsvファイルの場合は、split(‘,’)をsplit(‘\t’)にします。
open関数で読み込んだデータをPandasのDataframe形式に変換したい場合
Pandasで読み込みたい場合は、このようにします。
df = pd.DataFrame(hyou, columns=header)
df
方法②
csvモジュールを使って読み込む方法です。
hyou_ = []
with open('./oishi_gurume.csv') as f:
hyou = csv.reader(f)
for gyou in hyou:
if gyou == hyou[0]:
header = gyou
else:
hyou_.append(gyou)
これで、ヘッダー(カラム名)がheaderというリストに、それ以外がhyou_というリストに収まりました。
tsvファイルの場合は、「hyou = csv.reader(f)」を「hyou = csv.reader(f, delimiter = ‘\t’)」とします。
Pandasで読み込む方法は、方法①のところで述べた内容と同じです。
注意点:方法①でやるとうまくいかないケースがある
csvファイルを読み込む際に注意すべきは、要素の中にカンマ(,)を含む場合です。要素が英語の文章だったりすると、要素の中にカンマが入ることがあり、1要素なのにそこで分割されてしまう恐れがあります。
tsvファイルであれば、要素の中にタブのスペースを含む場合です。
方法②であればそのような不具合は起きないため、基本的には方法②を使った方がよいと思います。