前提・実現したいこと
複数のテキストファイルを1つのテキストファイルにまとめるプログラムを作成しました。
複数のテキストファイルは、
txt
10\t[数値] 20.0025\t[数値] 30.005\t[数値] 40.0075\t[数値] 50.01\t[数値]
というような形をしております。
1列目(x軸に相当)は、どのファイルも0.0025倍の数値になっています。
ただ、等間隔ではなくソートはされていますがランダムです。
(例)0.005がないファイルも出てくる
txt
10\t[数値] 20.0025\t[数値] 30.075\t[数値] 40.01\t[数値]
これを一つのテキストにまとめる為に作ったプログラムです。
まず、大きな箱(table_sum
40000行x3列)を作ります。
その後、足し合わせるファイルを1行ずつ.readline()
で読み込み
x軸に相当する1列目の値を確認して、
同じx軸の'table_sum'の2列目に数値を追加するようにしております。
そこで出てくる問題が、足した数値のファイル数の違いです。
2ファイル分足された所もあるし、3ファイル分足された所も出てくるので
table_sumの三列目に何回足されたかをカウントする列を作りました。
txt
1<table_sum> 20\t[数値の合計]\t[足し合わせたfileの数(2)] 30.0025\t[数値の合計]\t[足し合わせたfileの数(1)] 40.005\t[数値の合計]\t[足し合わせたfileの数(2)] 50.0075\t[数値の合計]\t[足し合わせたfileの数(2)]
以上の処理は問題なく出来るのですが、
実際読み込むファイルは14000行程度あり1ファイル振り分けるのに3秒くらいかかります。
4ファイルの場合: 4_file x 3_sec = 12sec
実用上もう少し早くしたいと思っているのですが、
どうにか早くなるコツはありませんでしょうか。
(listにこだわりはありません。)
該当のソースコード
python
1def data_sum(data_list, fname, dir_path): 2 3 table_sub1 = [round(m*0.0025, 4) for m in range(40000)] 4 table_sub2 = [0 for _ in range(40000)] 5 table_sub3 = [0 for _ in range(40000)] 6 table_sum = [table_sub1,table_sub2, table_sub3] 7 8 for n in data_list: 9 reg_path = dir_path + "\" + n 10 print(reg_path) 11 12 with open(reg_path, "r", encoding="utf_8") as reg_fobj: 13 while True: 14 line = reg_fobj.readline() 15 if line == "": 16 break 17 tth_val = round(float(line.split("\t")[0]), 4) 18 count_val = float(line.split("\t")[1]) 19 chk = tth_val in table_sum[0] 20 if chk == True: 21 column_no = table_sum[0].index(tth_val) 22 table_sum[1][column_no] = table_sum[1][column_no] + count_val 23 table_sum[2][column_no] = table_sum[2][column_no] + 1 24 print("-------> Make.sum") 25 26if __name__ == "__main__": 27 data_list = ['fname_No1.txt', 'fname_No2.txt', 'fname_No3.txt', 'fname_No4.txt'] 28 fname = "fname" 29 dir_path = "C:\" 30 data_sum(data_list, fname, dir_path)
補足情報(FW/ツールのバージョンなど)
windows10, python3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/23 17:08
2019/12/25 00:48 編集