LTSVは主にログファイルの形式として最近好まれているテキストフォーマットです。
http://ltsv.org/
一行一レコード、各セルをタブで区切っているところはTSVと同じなのですが、ヘッダ行に列タイトルを付ける代わりに各セルに直接ラベルをつけた形になっています。
host:example.com url:/api/users status:200 time:2018-01-01T00:00:00+09:00
host:example.com url:/api/users status:200 time:2018-01-01T00:00:01+09:00
このような見た目。
人の目にも読みやすく機械的にもパースしやすいのが利点です。
パースしやすさのためにあえて仕様にエスケープを含めていないほど。
さてこのLTSV形式、pandasに読み込み用メソッドが用意されていません。
pandasで処理したいときはどうするか。
ltsvというライブラリも公開されているのですが https://pypi.org/project/ltsv/ そこで何しろパースしやすいのが利点のLTSV形式、特にライブラリを追加しなくてもこんなコードで読み込めてしまいます。
from collections import OrderedDict
import pandas as pd
def ltsv_to_data_frame(filename):
"""
LTSVファイルを読み込んでpandas DataFrameを生成します
値はすべて文字列型となります
"""
with open(filename) as f:
return pd.DataFrame(
[OrderedDict(cell.split(':', 1)
for cell
in line.rstrip('\r\n').split('\t'))
for line in f])
これでは数字データもすべて文字列型になってしまう、それでは困るという場合。
いったんtsvに変換してからそれをpandasに読み込ませるとpandasがよしなに型付けしてくれます。
tsvに変換するには、上記のltsv_to_data_frame関数で作ったDataFrameがそのまま使えますね。
from io import StringIO # Python2の場合は from cStringIO
tsv = ltsv_to_data_frame(filename).to_csv(sep='\t', index=False)
df = pd.read_table(StringIO(tsv))
これで数値データはちゃんと数値型になったDataFrameが得られます。