周一到!我们又和大家见面啦!最近几周的主题是,有了数据,那我们怎么读写数据文件呢?气象中的特殊资料又有哪些处理方法呢?以txt和nc文件做引子,欢迎各位拍砖~
No.1
基础通用知识
读写文件时有一些由c语言衍生出来的读取数据的相关知识,它们大都是相通的。
1.1 文件打开模式
读取数据第一步!先打开一个数据文件。文件可以根据自己需要的不同,通过单个或组合使用以下符号的方式,在代码中使用。
打开模式 | 执行操作 |
'r' | 以只读方式打开文件(默认) |
'w' | 以写入的方式打开文件,会覆盖已存在的文件 |
'x' | 如果文件已经存在,使用此模式打开将引发异常 |
'a' | 以写入模式打开,如果文件存在,则在末尾追加写入 |
'b' | 以二进制模式打开文件 |
't' | 以文本模式打开(默认) |
'+' | 可读写模式(可添加到其他模式中使用) |
'U' | 通用换行符支持 |
例如,小明想以二进制的形式打开一个已存在的文件,在读入数据后,在文件中再持续写入数据,则查一查表中相对应的符号,他可以:
f = fopen('write_data.txt','ab+')
1.2 格式化文本
在将处理好的数据输出为其他格式的文件时,尤其要注意文件的写法。
要将数据转换为文本输出并控制其格式,可以将格式化操作符与常见的转换函数(如 num2str 、sprintf)结合使用。这些操作符可控制记数法、对齐方式、有效位数以及其他内容。其典型用途包括用于显示和输出文件的文本。
转换说明符:
占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。
符 号 | 说 明 |
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化定点数,可指定小数点后的精度 |
%e | 用科学计数法格式化定点数 |
%E | 作用同%e,用科学计数法格式化定点数 |
%g | 根据值的大小决定使用%f或者%e |
%G | 作用同%g,根据值的大小决定使用%F或者%E |
如果没有子类型字段,转换字符 %o、%x、%X 和 %u 会将输入数据按整数进行处理。要将输入数据按浮点值进行处理,并将它们转换为八进制、十进制或十六进制表示形式,请使用:
b | 输入数据为双精度浮点值,而不是无符号整数。例如,要以十六进制格式输出双精度值,请使用类似 %bx 的格式。 |
t | 输入数据为单精度浮点值,而不是无符号整数。 |
精度与字符宽度设置:
例如,在操作符%7.2f 中,7表示字段宽度,2表示精度。综合本部分前述内容,对圆周率pi进行格式转换:
txt = sprintf('%7.2f',pi)
得到结果:
标志
可选项,用于控制输出文本的其他格式:
字符 | 说明 | 示例 |
减号 (-) | 在字段中左对齐转换后的参数。 | %-5.2d |
加号 (+) | 对于数值,始终输出前导的符号字符(+ 或 -)。 对于文本值,在字段中右对齐转换后的参数。 | %+5.2d %+5s |
空格 | 在值之前插入空格。 | % 5.2f |
零 (0) | 用零而不是空格进行填充。 | %05.2f |
井号 (#) | 改选定的数值转换: · 对于 %o、%x 或 %X,将输出 0、0x 或 0X 前缀。 ·对于 %f、%e 或 %E,即使精度为零也将输出小数点。 · 对于 %g 或 %G,不删除尾随零或小数点。 | %#5.0f |
除此之外,实际编程中还常用转义字符控制输出文件的格式:\n为换行符,\t为水平制表符,表示同一行中的间隔,与一般打字时使用的Tap键功能类似。
No.2
txt文件的读写
你可能用到的函数:fopen、fwrite、fread、fscanf、importdata、load、save、textread等。(csv、xls等文件的读取方式均有类似的特殊函数,可用搜索引擎或MATLAB官网文档查阅~)
读写方法一:
load('file.txt','r')save('filename.txt',a)%a为需储存的变量名
读写方法二:
fid = fopen('filename.txt')[A,COUNT]=fscanf(fid,format,size)
其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)
fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为:
fprintf(fid,format,A)fcolse(fid) %最后不要忘记关闭文件
读取方法三:
[A,B,C,…] = textread(filename,format,N)
括号中变量的个数必须和format中定义的个数相同。如果每N行相同格式的数据,可采用[A,B,C,…] = textread(filename,format,N)的语法,读取N次。
或
[C,position] = textscan(fid, 'format', N, 'param', value)
在扫描结束时返回文件或字符向量中的位置作为第二个输出参数。对于文件,该值等同于调用 textscan 后再运行 ftell(fileID) 所返回的值。对于字符向量,position 指示 textscan 读取了多少个字符
或
A = importdata(filename)
No.3
nc文件的读写
读入:
A=ncread('filename.nc','Name',[1 1 1 1],[X Y 1 1]);%[1 1 1 1]为起始位置,X、Y为读取终点位置。
写入:
在写入nc文件时,要尤其注意在自己定义各项变量名、变量属性后再给变量进行赋值操作:
例如论坛里小伙伴threetee给出的示例截取(原贴链接在后方):
varid2 = netcdf.defVar(ncid,'lat','double',[dimidx]);%定义新变量netcdf.putAtt(ncid,varid2,'long_name','Latitude');%设定变量属性netcdf.endDef(ncid);netcdf.putVar(ncid,varid2,lat);%给新变量赋值netcdf.close(ncid);
也可以用read_grib工具包进行读写,在这里就不过多展开了,感兴趣的小伙伴可以去气象家园里自行探索:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=47599
其他关于nc文件读写的讨论如下:
NC文件读取教学(某一经纬度范围):(drx)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=89683
分享一个用MATLAB将数据写nc格式文件的程序:(threetee)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=28875
MATLAB批量读取nc文件,并进行数据处理,绘图:(吴东佑)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=52026
关于MATLAB读取nc数据并绘制风场:(zhangxk14)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=94405
nc数据全解读-3 数据处理:月数据变季度数据,年数据,数据标准化:(652554221)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=95001
用MATLAB读取和编写nc文件:(是兜兜啊)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=94319
nc文件与对应头文件的生成:(容与)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=37866
!!手把手教会!!读取nc文件变量到excel,再输出数据合成nc:(叮当卖卖猫)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=47365
No.4
关于读写文件的其他讨论
其他部分文件读写方法见下方链接内的论坛讨论:
微信不能添加外部超链接,请复制链接至浏览器食用!
关于用MATLAB一站式读取NetCDF, OPeNDAP, HDF5, GRIB, GRIB2, HDF4等等:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=47599
MATLAB对于文本文件(txt)数据读取的技巧总结:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=626
MATLAB读取grads数据的函数:(firenix)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=54519
MATLAB处理后的数据写为二进制用于GrADS画图——fwrite函数使用:(Aires)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=20308
MATLAB数据转grads格点数据函数:(斥鷃)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=12711
分享一个自己编的关于cmip5数据提取以及插值的程序:(lancerv8)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=53380
MATLAB读取卫星hdf数据步骤总结:(windprofiler)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=10454
MATLAB读取SA雷达基数据文件并进行显示:(又是那隻貓)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=14628
MATLAB自动读取micaps数据并存储为结构数组程序:(雪お轩漠)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=28016
MATLAB读取MICAPS数据源程序:(雪お轩漠)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=31259
读取MICAPS tlogp格式数据:(daveryjl)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=89801
分享一个读取.he5文件并画图的例子:(大物小子)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=95949
MATLAB读取AWX文件(TBB):(二爷名声在外)
http://bbs.06climate.com/forum.php?mod=viewthread&tid=51535
利用MATLAB提取图图片中的数据:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=5784
参考资料:
[1]MATLAB官网字符串格式化部分:https://ww2.mathworks.cn/help/matlab/matlab_prog/formatting-strings.html
[2]小甲鱼教程:https://fishc.com.cn/
本期内容到此结束!意犹未尽?
欢迎到家园MATLAB板块,一起玩耍吧!
http://bbs.06climate.com/
排版:自古以来没头发