Matlab 的各种数据读取、文件读写等操作汇总MATLAB 提供了多种方式从磁盘读入文件或将数据输入到工作空间,即读取数据,又叫导入数据;将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据。
至于选择哪种机制,则根据下面两个因素决定:•用户所执行的操作是导入数据还是导出数据;•数据的格式为文本格式、二进制格式还是如HDF 之类的标准格式。
将数据导入MATLAB 中最容易的方法就是使用导入数据模板(Import Wizard) ,使用该模板时不需要知道数据的格式,只需指定包含这些数据的文件,然后导入模板会自动处理文件内容。
本章重点内容如下:• 文件的打开和关闭• 文本文件的读取・存写ASCII数据•二进制数据的读取• 二进制数据的存写• 使用I/O文件函数进行数据读写・MAT 文件的读写2.1 文件的打开和关闭2.1.1 文件的打开无论是要读写ASCII 码文件还是二进制文件,都必须先用fopen 函数将其打开,在默认情况下,fopen 以二进制格式打开文件,它的使用语法如下:fopen ('filename', 'mode') 其中filename 表示要读写的文件名称,mode 则表示要对文件进行的处理方式,如下:rt :以只读方式(Reading)打开文件wt:以只写方式(Writing)打开文件at:以追加方式(Appending)打开文件,新内容将从原文件后面续写r+t:以同时读写方式打开文件w+t :以同时读写创建文件,原文件内容被清除a+t :以同时读和追加(Reading and Appdending) 方式,原文件内容被保留,新内容将从原文件的后面开始At :以读写方式打开或创建文件,适用于对磁带介质文件的操作Wt :以写入方式打开或创建文件,原文件内容被清除,适用于磁带介质文件的操作fopen 函数有两个返回值,一个是返回一个文件标志(file Identifier) ,它会作为参数被传入其他对文件进行读写操作的命令,通常是一个非负的整数,可用此标识来对此文件进行各种处理。
如果返回的文件标识是-1,则代表fopen无法打开文件,其原因可能是文件不存在,或是用户无法打开此文件权限。
另一个返回值就是message ,用于返回无法打开文件的原因。
为了安全起见,最好在每次使用fopen 函数时,都测试其返回值是否为有效值。
下面以脚本m 文件为例来声明文件的打开。
例2-1 %exam1.m[f,message]=fopen('fileexam1', 'r')if f==-1disp (message); % 显示错误信息end 若文件fileexam1 不存在,则显示如下信息。
Cannot open file.existence?permissions?memory?... 例2-2 %exam2.m[f,message]=fopen('fileexam2', 'r');if f==-1disp (message); % 显示错误信息else disp(f);end 若文件fileexam2 存在,则返回f值。
2.1.2 文件的关闭一旦完成文件的读写,最好关闭文件,以便对其进行其他操作。
这时就可以使用fclose 函数来关闭文件,其适用语法如下:fclose(f) 。
其中 f 为打开文件的标志,若fclose 函数返回值为0 ,则表示成功关闭 f 标志的文件;若返回值为-1,则表示无法成功关闭该文件。
一般来说,在完成对文件的读写操作后就应关闭它,以免造成系统资源浪费。
此外,需注意的是,打开和关闭文件都比较耗时,因此为了提高程序执行效率,最好不要在循环体内使用文件。
若要一次关闭打开的所有文件,可以使用下面的命令:fclose all 2.2 文本数据虽然MATLAB 自带的MAT 文件为二进制文件,但为了便于和外部程序进行交换以及方便查看文件中的数据,也常常采用文本数据格式与外界进行数据交换。
在文本格式中,数据采用ASCII 码格式,可以表示字母和数字字符。
ASCII 文本数据可以在文本编辑器中查看和编辑。
MATLAB 提供多种函数能够进行文件读写,这些函数都是MATLAB 的一部分,不需要额外的工具箱支持。
2.2.1 从文本文件中读取数据1 .使用导入模板来读取数据使用导入模板来读取数据,需按以下步骤进行:(1)选择File T ImportData 选项,然后弹出一个文件选择对话框;也可以使用uiimport 函数来打开导入数据模板。
(2) 在文件选择对话框中选择想导入数据的文本文件,然后单击Open 按钮,导入数据模板就会打开该文件并准备处理其内容。
(3) 指定用于分开单个数据的字符,该字符称为分隔符或列分隔符。
在多数情况下可以用导入模板来设定分隔符。
(4) 选择要导入的变量。
在默认情况下,导入模板将所有的数值数据放在一个变量中,而将文本数据放在其他变量中。
(5) 单击Finish 按钮完成数据的导入。
当使用导入模板来打开一个文本文件时,在导入模板对话框的预览区仅显示原始数据的一部分,通过它,用户可以验证该文件中的数据是否为所期望的。
导入模板也根据文件中的数据分隔符来对导入的数据进行预处理。
在导入模板中打开工作区中的grade.txt 文件。
english math physicjoe 80 90 60susan 78 98 88rob 67 90 89 图2-1 将数据通过模板导入在图2-1 中,导入模板已辨认space 字符,把它作为文件中数据的分隔符,并建立了两个变量:data( 包含文件中所有数值数据)和textdata( 包含文件中所有文本数据)。
当导入模板正确导入文件中的数据后,就会显示它所建立的变量。
要选择一个变量来导入数据,可单击它名称后面的复选框。
在默认情况下,所有变量都会被选中。
在导入对话框的右面显示了导入模板建立的变量内容。
要查看其他变量,只需要单击该名称。
在选择好要导入的变量后,单击Next 按钮,如图2-2 所示。
图2-2 使用模板查看各变量数据在默认情况下,导入模板将文件中所有的数值数据放在一个变量中;若文件包含文本数据,则模板将它们放在另外一个变量中;若文件包含行或列,模板也将它们作为各自独立的变量分别称为行头和列头。
当所有导入模板创建好数据后,使用作whos 命令可以查看工空间的变量。
>> whosName Size BytesClass Attributesdata3x372doubletextdata4x1314cell2. 使用函数来读取文本数据若要在命令行或在一个M 文件中读取数据,必须使用MATLAB 数据函数,函数的选择则是依据文本文件中数据的格式。
而且文本数据格式在行和列上必须采取一致的模式,并使用文本字符来分隔各个数据项,称该字符为分隔符或列分隔符。
分隔符可以是space 、comma 、semicolon 、ab 或其他字符,单个的数据可以是字母、数值字符或它们的混合形式。
文本文件也可以包含称之为头行的一行或多行文本,或可以使用文本头来标志各列或各行。
在了解要输入数据的格式之后,便可以使用MATLAB 函数来读取数据了。
若对MATLAB 函数不熟悉,可从表2-2 中了解几个读取函数的一些使用特征。
表2-2 读取函数的比较函数|数据类型|分隔符返回值csvread | 数值数据|仅cooma|1dlmread| 数值数据| 任何字符|1fscanf| 字母和数值|任何字符|1load| 数值数据|仅space|1textread| 字母和数值|任何字符| 多返回值3. 读取数值文本数据若用户的数据文件只包含数值数据,则可以使用许多MATLAB 函数,这取决于这些数据采用的分隔符。
若数据为矩形形状,也就是说,每行有同样数目的元素,这时可以使用最简单的命令load(load 也能用于导入MAT 文件,该文件为用于存储工作空间变量的二进制文件,如果文件名后缀是.dat ,则MATLAB 会以MAT 文件格式进行读取)。
例如,文件my_data.txt 包含了两行数据,各数据之间由space 字符隔开。
当使用load 时,它将读取数据并在工作空间中建立一个与该文件同名的变量,但不包括扩展名。
>>load my_data.txt; 调用whos 命令查看工作空间的变量。
>> whosName Size BytesClass Attributesdata 3x3 72 double my_data 3x4 96 double textdata4x1 314 cell 此时可以查看与该文件同名的变量的值>> my_datamy_data =0.3242 0.4324 0.3455 0.6754 0.45660.9368 0.9892 0.9274 0.4658 0.28320.9373 0.8233 若想将工作空间的变量以该文件名命名,则可以使用函数形式的load ,下面的语句将文件导入工作空间并赋给变量AA=load('my_data.txt');4. 读取有分隔符的ASCII 数据文件如果数据文件不使用空格符而是使用逗号或是其他符号作为分隔符,用户可以选择多个可用的导入数据函数。
最简单的便是使用函数dlmread 举个例子来说,一个名为lcode.dat 的数据文件,数据内容由逗号分隔。
0.3445,0.8433,0.78650.7562,0.4233,0 要把该文件的全部内容读入阵列 A ,只须输入如下命令:>> A=dlmread('lcode.dat',',') 即可以把数据文件中使用的分隔符作为函数dlmread 的第二个参数。
注意:即使每行的最后一个数据后面不是逗号,dlmread 函数仍能正确读取数据,因为dlmread 忽略了数据之间的空格符。
因此,即使数据为如下格式,前面的dlmread 命令仍能正常工作。
A =0.3445 0.8433 0.7865 0.7562 0.42330 另外需要注意的是,分隔符只能选取单个字符,不能用字符串来作为分隔符。
5. 使用文本头读取数值数据要读取一个包含文本头的ASCII 码数据文件,可以使用textread 函数,并指定头行参数。
调用函数textread 同样非常简单,同时对文件读取的格式处理能力更强,函数接收一组预先定义好的参数,由这些参数来控制变量的不同方面。
Textread 既能处理有固定格式的文件,也可以处理无格式的文件,还可以对文件中每行数 据按列逐个读取。