如何用Python高效读取VMF1格网文件(如VMFG_20221231.H00)
Python高效读取VMF1格网文件的实用方法
先理清VMF1格网文件的结构:
文件中以
!开头的行是注释元数据,后续每行是空格分隔的数值,对应字段依次为:纬度(lat)、经度(lon)、湿延迟系数(ah)、干延迟系数(aw)、天顶干延迟(zhd)、天顶湿延迟(zwd)
下面分享几个高效的读取方法:
1. 用Pandas一键读取(最省心)
Pandas的read_csv可以直接适配这类空格分隔的文本,自动跳过注释行,还能直接生成DataFrame,方便后续的数据筛选、分析操作,处理大文件速度也很可观。
import pandas as pd # 读取文件,跳过!开头的注释行,指定字段名 df = pd.read_csv( "VMFG_20221231.H00", comment='!', delim_whitespace=True, names=['lat', 'lon', 'ah', 'aw', 'zhd', 'zwd'] ) # 查看前5行数据验证 print(df.head())
2. 用Numpy加载数值数组(内存更高效)
如果只需要原始数值数组,不需要DataFrame的额外功能,Numpy的loadtxt是更好的选择——内存占用更低,读取速度更快,适合处理超大型VMF文件。
import numpy as np # 读取数据,跳过注释行,指定数据类型为float64 data_array = np.loadtxt( "VMFG_20221231.H00", comments='!', dtype=np.float64 ) # 拆分各个字段 latitudes = data_array[:, 0] longitudes = data_array[:, 1] ah_values = data_array[:, 2] aw_values = data_array[:, 3] zhd_values = data_array[:, 4] zwd_values = data_array[:, 5] # 打印前3组数据验证 print(f"前3组纬度数据:{latitudes[:3]}") print(f"前3组经度数据:{longitudes[:3]}")
3. 纯Python生成器逐行读取(极致灵活)
要是你需要逐行处理数据,或者文件大到没法一次性加载到内存,用纯Python配合生成器的方式最合适——不会一次性加载所有数据,内存压力极小,还能自定义每一行的处理逻辑。
def read_vmf1_file(file_path): with open(file_path, 'r', encoding='utf-8') as f: for line in f: # 跳过注释行 if line.startswith('!'): continue # 清理行内容并分割成数值 line_data = line.strip() if not line_data: continue values = list(map(float, line_data.split())) if len(values) == 6: yield values # 使用生成器读取数据 vmf_generator = read_vmf1_file("VMFG_20221231.H00") # 遍历查看前5条数据 for idx, row in enumerate(vmf_generator): if idx >= 5: break print(f"第{idx+1}行数据:{row}")
内容的提问来源于stack exchange,提问作者Shanker
相关产品推荐
相关产品推荐

