【Python】csvファイルの区切り文字を判定する関数を作る。
こんにちは。のうないです。
csvファイルは基本的にコンマ(, )で区切られたデータ構造になっています。
しかし、稀にスペースやタブで区切られている場合もあります。
pandas.read_csv()で読み込もうとしても正しく列が区切られず、困ります。引数のdelimiterで指定すれば解決しますが、面倒くさいですね。
やりたいこと
csvファイルの区切り文字を判定する関数を作る。
コード全体
def detect_delimiter(filepath:str)->str:
#ファイルの一行目を読み込む
first_line = open(filepath).readline().rstrip()
best_delimiter = None #正しい区切り文字
max_list_length = 0 #とある区切り文字で分割したときの列の数
#想定される区切り文字に対して繰り返し処理
for delim in (',', ' ', '\t'):
#ファイルの一行目を区切り文字で区切ってリスト化
sp_list = first_line.split(sep=delim)
#区切り文字の判定
if len(sp_list)>max_list_length:
max_list_length = len(sp_list)
best_delimiter = delim
#最良の区切り文字を返す
return best_delimiter
解説
ロジックは単純です。
想定される区切り文字を使ってデータを区切ったとき、最も列数が多くなる区切り文字を返すというもの。
単純ゆえにファイルの中身次第で誤判定もあり得ますので悪しからず。
ファイルの一行目を読みこむ
open()でファイルを開き、readline()でファイルの1行目を取得します。
つまり、データがファイルの1行目から始まることを前提としています。
大抵はデータの列名を読み込むことになります。
読み込んだ行の末尾には改行(\n)がくっついているので、rstrip()で取り除きます。
#ファイルの一行目を読み込む
first_line = open(filepath).readline().rstrip()
想定される区切り文字で繰り返し処理
想定される区切り文字をリストかタプルで用意し、for文で回します。
今回は、コンマ(',')、スペース(' ')、タブ(\t)を想定します。
#想定される区切り文字に対して繰り返し処理
for delim in (',', ' ', '\t'):
#ここに処理を書く
区切り文字でファイルの1行目を区切ってみる
読み込んだ行(first_line)をsplit()で分割してリストにしてみます。split()の引数sepに区切り文字delimを指定します。
first_line = 'colA,colB,colC,colD'だとすると、以下のようになります。
・delim = ',' (カンマ)の場合
'colA,colB,colC,colD' → ['colA', 'colB', 'colC', colD'] 長さ4のリスト
・delim = ' ' (スペース)の場合
'colA,colB,colC,colD' → ['colA,colB,colC,colD'] 長さ1のリスト
#ファイルの一行目を区切り文字で区切ってリスト化
sp_list = first_line.split(sep=delim)
区切り文字を判定する
区切ってみた結果、リストの長さが歴代最大だったら、その区切り文字を保持します。
繰り返し処理が終わったら、保持している区切り文字を最適な区切り文字として返します。
#区切り文字の判定
if len(sp_list)>max_list_length:
max_list_length = len(sp_list)
best_delimiter = delim