3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LTSVをpandasに読み込む

Posted at

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が得られます。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?