タイトルの通りになりますが、お仕事の内容によってはこの様なレアなケースもあるかと思います。
使った構文等をメモがてらに残していこうと思います。
Pythonのバージョンは3.6です。
Python初心者のため、間違い等ありましたら、コメント頂けますと幸いです。
目標
2つの表形式の.tsvファイルから必要なデータを取り出し1つの表形式データにしたい。
importしたもの
import gzip #圧縮ファイルを処理する場合必要
import csv #csvやtsvで書き込む場合必要
import sys #コマンド実行時 引数をとる場合必要
ファイル読み込み
2種類の方法を検討しました
open関数
#読み込みモードでファイルを開く
file = open("data.tsv","rt")
###処理等###
#ファイルを閉じる
file.close()
・詳細のモードの設定など
この場合、テキストでの読み込みをしています。
モードを指定することで書き込みなどもできる様になります。
close()を忘れずに。
with open
with open("data.tsv", "rt") as file
大きな違いはclose()が必要なく、勝手にファイルをクローズしてくれます。
with構文は通信やデータベースへのアクセスにも使えて、これらも勝手にクローズや終了をしてくれます。
こちらもモードを指定することで書き込みもできます。
今回はこちらを採用いたしました。
実行時の引数を取得
pythonの実行時に引数を入れることでそれに応じた処理をさせたい時に利用できます。
例えばこんな感じで実行
$ python sys.py 12 24 36
args = sys.argv #宣言 引数2個以上の場合、配列になる
#args[0]にはスクリプトファイル名が入るため、args[1]から取得していく
num1 = args[1] #num1 = 12
num2 = args[2] #num2 = 24
num3 = args[3] #num3 = 36
必要な列のデータを取得
表形式なので、表を縦に分割して、必要な列を取り出します。
file1:
ア行 | カ行 | サ行 |
---|---|---|
あ | か | さ |
い | き | し |
う | く | す |
file2:
サ行 | タ行 | ナ行 |
---|---|---|
さ | た | な |
す | つ | ぬ |
せ | て | ね |
これはテーブル型なので、少しややこしいですが、データはtsvなので、表形式でタブ区切りのものです。
そのタブを区切り文字として指定することで列を取得できます。
列はカラムを含めると4つデータを取得する必要がありますので、for文で繰り返し処理をします。
今回はfile1からア行とサ行を、file2からサ行とナ行を取得します。
data1 = []
data2 = []
data3 = []
data4 = []
for line1 in file1:
list1 = file1.split('\t') #タブを区切り文字にして分割
data1.append(list1[1]) #[あ、い、う]
data2.append(list1[3]) #[さ、し、す]
for line2 in file2:
list2 = file2.split('\t')
data3.append(list2[1]) #[さ、す、せ]
data4.append(list2[3]) #[な、ぬ、ね]
for文の条件にfileを指定するとファイルの中身が終わるまで処理をしてくれます。
dataは配列で入るため、事前に宣言をしています。
表形式結合
SQLでテーブルを結合させる際は、共通のデータを照らし合わせます。
その様な動きを条件文を使ってやってみます。
file1から取得したデータとfile2から取得したデータをそれぞれfor文で回し、データの内容が一致するものを格納する流れにします。
今回はサ行のデータを条件にします。
table = []
for i in range(len(data1)): #4 range(len('変数名'))でデータの数を返します。
for j in range(len(data3)):
if data2[i] == data3[j]:
table.append([data1[i], data2[i], data4[j])
ア行 | サ行 | ナ行 |
---|---|---|
あ | さ | な |
う | す | ぬ |
この様に表形式のデータを結合することができました。
ファイル書き込み
このデータを新たなファイルに書き込んでいきます。
with open.gzip("data.tsv.gz", "rt") as file:
write = csv.writer(file, lineterminator = '\n', delimiter = '\t')
for output_data in table:
writer.writerow(output_data)
最初にcsvライブラリをimportしましたが、ここで登場します。
Pythonの標準ライブラリにcsvモジュールはcsvやtsvで読み込みや書き込みを行うことが可能です。
・csvライブラリ
区切り文字(delimiter)をタブにすることでtsvファイルでの保存が可能になります。
lineterninatorは改行文字です。
また、with open.gzipとすることでgzファイルに圧縮することも可能です。
まとめ
標準ライブラリの使用のみで表形式データを加工することができました。
結合以外にも変換や、datatime処理をしましたが、それはまた書く気になったら別で書きます。
僕自身、初めてのPythonだったのですが、配列関係、インデント関係のエラーで結構詰まりました。
その辺りは他の丁寧に書かれている記事を参考にしてください(逃げます)
最後に.....
表形式を加工する場合、よっぽどの理由がない限りは、外部ライブラリのpandasやNumpyの使用をオススメします。