Python、機械学習

【Python】Pandasを使わずにcsvやtsvファイルを開く方法(open関数)

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ファイルであれば、要素の中にタブのスペースを含む場合です。

方法②であればそのような不具合は起きないため、基本的には方法②を使った方がよいと思います。