アイキャッチ画像

PythonでTSVファイルの読み込みと書き出しをする

Pythonでcsvモジュールを使って、TSVデータ(タブでフィールドを区切ったデータ)をファイルから読み込んだりファイルに書き出したりしてみます。

目次

  1. readerオブジェクトとwriterオブジェクト
  2. 試してみた

readerオブジェクトとwriterオブジェクト

方法は基本的に CSVファイルの場合 と同じです。区切り文字にタブを指定するだけです。

csvモジュールでは、オープン済みのファイルからreaderオブジェクトを使ってデータを読み込みます。書き込むときは同様にwriterオブジェクトを使って書き込みます。

r = csv.reader(f, [dialect], [fmtparams])
変数 内容
r readerオブジェクト。
dialect 省略可。初期値はExcel。CSV/TSVの書式のプリセット。
fmtparams 省略可。CSV/TSVの書式の個別設定。
f ファイルオブジェクト。
w = csv.writer(f, [dialect], [fmtparams])
w.writerows(d)
変数 内容
w writerオブジェクト。
f ファイルオブジェクト。
dialect 省略可。初期値はExcel。CSV/TSVの書式のプリセット。
fmtparams 省略可。CSV/TSVの書式の個別設定。
d 書き込むデータ。

writerオブジェクトもreaderオブジェクトも、dialectの初期値がExcelですので何も指定しないでオブジェクトを作るとフィールドの区切り文字がカンマになります。これはdialectのExcelというプリセットの区切り文字の設定値がカンマになっているからです。

TSVデータを読み込む場合にはこの区切り文字をカンマからタブに変更します。

r = csv.reader(f, delimiter='\t')

試してみた

例えば、こういうTSVデータがtest.tsvに保存されているとします。

# col1       col2    col3
A1   "B1"    -1
A2   "B2"    0
A3   "B3"    1.0

これを読み込んで、そのままout.tsvというファイルに書き出してみます。

>>> import csv
>>> with open('test.tsv', mode='r', newline='', encoding='utf-8') as f:
...     tsv_reader = csv.reader(f, delimiter='\t')
...     read_data = [row for row in tsv_reader]
...
>>> read_data  # 読みやすいように改行だけ整形しました
[
['# col1', 'col2', 'col3'],
['A1', 'B1', '-1'],
['A2', 'B2', '0'],
['A3', 'B3', '1.0']
]

>>> with open('out.tsv', mode='w', newline='', encoding='utf-8') as fo:
...     tsv_writer = csv.writer(fo, delimiter='\t')
...     tsv_writer.writerows(read_data)

途中で読み込んだデータを表示しています。

行頭に#を付けてコメント扱いにする文化もあると思いますが、無視されてますね。

数字もすべて文字列として読み込まれました。

データの前後のダブルクォーテーションが削除されました。

これをファイルに出力するとこうなります。

# col1       col2    col3
A1   B1      -1
A2   B2      0
A3   B3      1.0

タブ区切りで出力されてますね。

広告

PythonでCSVカテゴリの投稿