matlab的各种数据读取(txt,dat,mat等格式),⽂件打开关闭MATLAB提供了多种⽅式从磁盘读⼊⽂件或将数据输⼊到⼯作空间,即读取数据,⼜叫导⼊数据;将⼯作空间的变量存储到磁盘⽂件中称为存写数据,⼜叫导出数据。⾄于选择哪种机制,则根据下⾯两个因素决定:
●⽤户所执⾏的操作是导⼊数据还是导出数据;
●数据的格式为⽂本格式、⼆进制格式还是如HDF之类的标准格式。
将数据导⼊MATLAB中最容易的⽅法就是使⽤导⼊数据模板(Import Wizard),使⽤该模板时不需要知道数据的格式,只需指定包含这些数据的⽂件,然后导⼊模板会⾃动处理⽂件内容。
本章重点内容如下:
●⽂件的打开和关闭
●⽂本⽂件的读取
●存写ASCII数据
●⼆进制数据的读取
●⼆进制数据的存写
●使⽤I/O⽂件函数进⾏数据读写
● MAT ⽂件的读写
2.1  ⽂件的打开和关闭
2.1.1  ⽂件的打开
⽆论是要读写ASCII码⽂件还是⼆进制⽂件,都必须先⽤fopen函数将其打开,在默认情况下,fopen以⼆进制格式打开⽂件,它的使⽤语法如下:
fopen ('filename', 'mode')
其中filename表⽰要读写的⽂件名称,mode则表⽰要对⽂件进⾏的处理⽅式,可以是表2-1中的任⼀字符串。
表2-1  ⽂本⽂件打开的模式
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==-1
disp (message);  %显⽰错误信息
end
若⽂件fileexam1不存在,则显⽰如下信息。
Cannot istence?permissions?memory?...
例2-2  %exam2.m
[f,message]=fopen('fileexam2', 'r');
if f==-1
disp (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→Import Data选项,然后弹出⼀个⽂件选择对话框;也可以使⽤uiimport函数来打开导⼊数据模板。
(2) 在⽂件选择对话框中选择想导⼊数据的⽂本⽂件,然后单击Open按钮,导⼊数据模板就会打开该⽂件并准备处理其内容。
(3) 指定⽤于分开单个数据的字符,该字符称为分隔符或列分隔符。在多数情况下可以⽤导⼊模板来设定分隔符。
(4) 选择要导⼊的变量。在默认情况下,导⼊模板将所有的数值数据放在⼀个变量中,⽽将⽂本数据放在其他变量中。
(5) 单击Finish按钮完成数据的导⼊。
当使⽤导⼊模板来打开⼀个⽂本⽂件时,在导⼊模板对话框的预览区仅显⽰原始数据的⼀部分,通过它,⽤户可以验证该⽂件中的数据是否为所期望的。导⼊模板也根据⽂件中的数据分隔符来对导⼊的数据进⾏预处理。在导⼊模板中打开⼯作区中的⽂件。
english  math  physic
python怎么读取dat文件joe        80    90      60
susan        78    98      88
rob        67    90      89
图2-1  将数据通过模板导⼊
在图2-1中,导⼊模板已辨认space字符,把它作为⽂件中数据的分隔符,并建⽴了两个变量:data(包含⽂件中所有数值数据)和textdata(包含⽂件中所有⽂本数据)。
当导⼊模板正确导⼊⽂件中的数据后,就会显⽰它所建⽴的变量。要选择⼀个变量来导⼊数据,可单击它名称后⾯的复选框。在默认情况下,所有变量都会被选中。在导⼊对话框的右⾯显⽰了导⼊模板建⽴的变量内容。要查看其他变量,只需要单击该名称。在选择好要导⼊的变量后,单击Next按钮,如图2-2所⽰。
图2-2  使⽤模板查看各变量数据
在默认情况下,导⼊模板将⽂件中所有的数值数据放在⼀个变量中;若⽂件包含⽂本数据,则模板将它们放在另外⼀个变量中;若⽂件包含⾏或列,模板也将它们作为各⾃独⽴的变量分别称为⾏头和列头。
当所有导⼊模板创建好数据后,使⽤whos命令可以查看⼯作空间的变量。
>> whos
Name              Size            Bytes      Class    Attributes
data              3x3            72      double
textdata              4x1            314      cell
2. 使⽤函数来读取⽂本数据
若要在命令⾏或在⼀个 M ⽂件中读取数据,必须使⽤ MATLAB 数据函数,函数的选择则是依据⽂本⽂件中数据的格式。⽽且⽂本数据格式在⾏和列上必须采取⼀致的模式,并使⽤⽂本字符来分隔各个数据项,称该字符为分隔符或列分隔符。分隔符可以是space、comma、semicolon、ab或其他字符,单个的数据可以是字母、数值字符或它们的混合形式。
⽂本⽂件也可以包含称之为头⾏的⼀⾏或多⾏⽂本,或可以使⽤⽂本头来标志各列或各⾏。在了解要输⼊数据的格式之后,便可以使⽤MATLAB 函数来读取数据了。若对 MATLAB 函数不熟悉,可从表2-2中了解⼏个读取函数的⼀些使⽤特征。
表2-2  读取函数的⽐较
函数
数据类型
分隔符
返回值
csvread
数值数据
仅cooma
1
dlmread
数值数据
任何字符
1
fscanf
字母和数值
任何字符
1
load
数值数据
仅space
1
textread
字母和数值
任何字符
多返回值
3. 读取数值⽂本数据
若⽤户的数据⽂件只包含数值数据,则可以使⽤许多MATLAB函数,这取决于这些数据采⽤的分隔符。
若数据为矩形形状,也就是说,每⾏有同样数⽬的元素,这时可以使⽤最简单的命令load(load也能⽤于导⼊MAT⽂件,该⽂件为⽤于存储⼯作空间变量的⼆进制⽂件,如果⽂件名后缀是.dat,则MATLAB会以MAT⽂件格式进⾏读取)。
例如,⽂件包含了两⾏数据,各数据之间由space字符隔开。
当使⽤load时,它将读取数据并在⼯作空间中建⽴⼀个与该⽂件同名的变量,但不包括扩展名。
>>load ;
调⽤whos命令查看⼯作空间的变量。
>> whos
Name              Size            Bytes          Class    Attributes
data              3x3              72          double
my_data          3x4              96        double
textdata              4x1              314          cell
此时可以查看与该⽂件同名的变量的值
>> my_data
my_data =
0.3242    0.4324    0.3455    0.6754
0.4566    0.9368    0.9892    0.9274
0.4658    0.2832    0.9373    0.8233
若想将⼯作空间的变量以该⽂件名命名,则可以使⽤函数形式的load,下⾯的语句将⽂件导⼊⼯作空间并赋给变量A
A=load('');
4. 读取有分隔符的ASCII数据⽂件
如果数据⽂件不使⽤空格符⽽是使⽤逗号或是其他符号作为分隔符,⽤户可以选择多个可⽤的导⼊数据函数。最简单的便是使⽤函数dlmread。
举个例⼦来说,⼀个名为lcode.dat的数据⽂件,数据内容由逗号分隔。
0.3445,0.8433,0.7865
0.7562,0.4233,0
要把该⽂件的全部内容读⼊阵列A,只须输⼊如下命令:
>> A=dlmread('lcode.dat',',')
即可以把数据⽂件中使⽤的分隔符作为函数dlmread的第⼆个参数。
注意:
即使每⾏的最后⼀个数据后⾯不是逗号,dlmread函数仍能正确读取数据,因为dlmread忽略了数据之间的空格符。因此,即使数据为如下格式,前⾯的dlmread命令仍能正常⼯作。
A =
0.3445    0.8433    0.7865
0.7562    0.4233        0
另外需要注意的是,分隔符只能选取单个字符,不能⽤字符串来作为分隔符。
5. 使⽤⽂本头读取数值数据
要读取⼀个包含⽂本头的ASCII码数据⽂件,可以使⽤textread函数,并指定头⾏参数。调⽤函数textread 同样⾮常简单,同时对⽂件读取的格式处理能⼒更强,函数接收⼀组预先定义好的参数,由这些参数来控制变量的不同⽅⾯。Textread既能处理有固定格式的⽂件,也可以处理⽆格式的⽂件,还可以对⽂件中每⾏数据按列逐个读取。
textread函数常见的调⽤⽅法有如下⼏种:
[A,]=textread('filename', 'format')
[A,]=textread('filename', 'format',N)
例如⽂件包含了如下⽂件内容,有⼀⾏⽂本头,且格式化的数值数据。
num1    num2    num3    num4
0.3242  0.4324  0.3455  0.6754
0.4566  0.9368  0.9892  0.9274
0.4658  0.2832  0.9373  0.8233
因为有⽂件头,要使⽤如下textread命令来读取⽂件中的数据。
>> [num1 num2 num3 num4]=textread('','%f %f %f %f','headerlines',1)
执⾏结果如下:
num1 =
0.3242
0.4566
0.4658
num2 =
0.4324
0.9368
0.2832
num3 =
0.3455
0.9892
0.9373
num4 =
0.6754
0.9274
0.8233
6. 读取字母数值混合的数据
若数据⽂件中包含了字母和数值混合的ASCII码数据,也可以使⽤函数textread来读取数据。由上⼀⼩节知道,函数textread可以返回多个输出变量,实际上⽤户还可以通过参数指定每个变量的数据类型。
例如要把⽂件my_exam.dat的全部内容读⼊⼯作空间,需要在textread⾏数的输⼊参数中指定数据⽂件的名称和格式。
⽂件my_exam.dat包含的混合的字母和数值如下:
Joe    gradeA  4.9  pass
susan  gradeD  2.0  fail
如果想把4列数据全部读取出放在4个变量中,则使⽤如下命令:
>> [name  gra  grades  answer]=textread('my_exam.dat','%s %s %f %s')
在这⾥要注意命令中格式字符串的定义,对于格式字符串中定义的每种变换,必须指定⼀个单独的输出变量,textread 函数按格式字符串中指定的格式处理⽂件中的某个数据项,并把值放在输出变量中。输出变量的数⽬必须和格式字符串中指定的变换数⽬项匹配,在该例中,函数按格式字符串来读取⽂件my_exam.dat的每⼀⾏,直到⽂件读完,该命令的执⾏结果是:
name =
'Joe'
'susan'
gra =
'gradeA'
'gradeD'
grades =
4.9000
2.0000
answer =
'pass'
'fail
另外,textread函数可以有选择地读取数据,⽐如我们不需要取出中间⼏列数据,只取出第⼀列和最后⼀列数据,则可以使⽤命令:
>> [name  answer]=textread('my_exam.dat','%s %*s %*f %s')
name =
'Joe'
'susan'
answer=
'pass'
'fail'
若⽂件采⽤的分隔符不是空格,则必须使⽤函数textread ,将该分隔符作为它的参数。例如,若⽂件my_exam.dat 使⽤分号作为分隔符,则读⼊该⽂件需使⽤如下命令:
[name  gra  grades  ans]=textread('my_exam.dat','%s %s %f %s', 'delimiter', '; ')
2.2.2  存写ASCII码数据
本⼩节介绍如何使⽤MATLAB函数按⼏种通⽤的ASCII码格式来存写数据,即如何使⽤这些函数来把⼀个MATLAB数值矩阵写⼊到⼀个⽂本⽂件中,其中该矩阵的列和⾏使⽤空格符来分隔。⽤户采⽤什么函数取决于所要存写数据的数据量和数据格式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。