# 需安裝 numpy 套件
import numpy as np
import os.path as op
from os import listdir
from os.path import isfile, isdir, join
import re
def bin2csv(in_fn, out_fn, v_type, t_res, s_res):
'''
in_fn : 輸入binary檔名
out_fn : 輸出csv檔名
v_type : 變數類別, TT, TX, TN, RR, TD, RH, PP
t_res : 時間解析度 時 HR, 日 DY or 月 MN
s_res : 空間解析度 GFE1km, GFE2p5km
'''
#----- 從 binary file 讀入格點資料, 重點 dtype -> single precision float\
print("input-file-17: {0}".format(in_fn))
bin_data = np.fromfile(in_fn, dtype='float32')
print(type(bin_data))
print(bin_data.shape)
#---- reshape 成 GFE1km or GFE2.5km
if s_res == "GFE1km" :
row, col = 650, 650
elif s_res == "GFE2p5km" :
row, col = 260, 260
out_array = bin_data.reshape(row, col)
#print(out_array)
#---- fmt 格式應隨資料值大小, 特別是雨量的資料長度會依 hr, dy, mn 而須增加
#---- 應只有雨量分 (hr), (dy,mn) 2種格式
# 還須判斷變數種類
if v_type == "RR" :
if t_res == "HR":
out_fmt="%6.1f" # 長度因時間尺度而變
elif t_res == "DY" or t_res == "MN": # 1000.8
out_fmt="%7.1f"
elif v_type == "TT" or v_type == "TD" :
out_fmt="%6.1f"
elif v_type == "PP" : # 1009.1
out_fmt="%7.1f"
elif v_type == "RH" : # 100
out_fmt="%3.1f"
np.savetxt(out_fn, out_array, fmt=out_fmt, delimiter=",")
if __name__ == "__main__" :
# bin檔案所在目錄
#path = "D:\Temp\Python"
path = r"C:\Users\XYZ\TT"
# 取得所有檔案與子目錄名稱
files = listdir(path)
#files = [files[3], files[5]]
print(files)
re_pattern = re.compile(".*\.bin")
for f in files:
if_match = re_pattern.match(f)
# method 1: re
if if_match is None:
continue
else:
print("pattern-match-88: {0}".format(if_match.group(0)))
# method 2: str slice
#if f[-3:] != "bin":
# continue
in_fn = path + "\\" + f
print('main-infile-78: ', in_fn)
out_fn = path + "\\" + f[:-4] + ".csv"
print('main-outfile-80: ', out_fn)
v_type = "TT"
t_res = "DY"
s_res = "GFE2p5km"
bin2csv(in_fn, out_fn, v_type, t_res, s_res)