第六章 文件操作
这一章的内容是关于文件的操作、数据的存储,我们会涉及的内容有:
- 文件数据的存储;
- 数据导入
- 文件的打开
- 文本文件的读写
- 低层文件的I/O操作
- EXCEL的文件操作
今天的自学笔记可能会略长
一、文件、数据的存储
1.保存整个工作区
如果想长久保存MATLAB工作区(workspace)的数据,我们要生成.MAT数据文件:
方法:
- 点击“File”菜单中的“Save Workspace As…”
- 点击工作区浏览器工具栏中的“Save”按钮
2.保存工作区中的变量
- 工作区浏览器中,右键单击需要保存的变量名,选择“Save As…”菜单项,将该变量保存为MAT文件
3.使用save 命令保存
- save filename…
- 保存整个工作区到制定的filename文件中
- 如果不指定扩展名,则默认为.MAT文件
- 如果不指定文件名,则默认为:“matlab.mat”
- MAT文件可以通过**load()**函数再次导入工作区
save data a b;
load data
- save filename x-ascii
- MAT文件是标准的二进制文件:以二进制的方式存储变量,通常file会比较小,而且载入时速度较快,但是无法用普通的文本软件看到内容;
- 使用save filename x-ascii可以将变量x以八位数存到filename的ASCII档案
save data a b -ascii
load data a b -ascii
在save命令使用-ascii选项后,会有以下现象:
1) 对于相同的变量,ASCII档案通常较大
2)save命令不会在档案后加 .mat 的扩展名——以**.mat** 结尾的档案通常是MATLAB的二进制资料。
3)通常只存储一个变量,若在save后加入多个变量,仍可执行,但产生的档案无法简单的load:
4)原有的变量名称消失。因此在将档案以load载入时,会取用档案名称为变量名称;
5)对于复数,只能储存其实部,而虚部则会消失;
6)为了有较好的兼容性,我们一般应该使用ascii方式存储资料。
-
save(‘filename’)
1)将工作区中的所有变量保存为MAT文件
2)文件名由filename制定
3)如果filename中包含路径,则文件保存在相应目录下,否则默认为当前路径 -
save(‘filename’, ‘var1’, ‘var2’, …):
保存指定的变量 -
save(‘filename’ , ‘struct’ , ‘s’):
保存结构体s中的全部域作为单独的变量 -
save(‘filename’ , ‘struct’ , ‘s’ , ‘f1’ , ‘f2’,…):
保存结构体s中的指定变量
定义一个结构体:
s.a = 10; s.b = 1;
- save(’-regexp’ , expr1 , expr2):
通过正则表达式*指定待保存的变量所满足的条件
正则表达式: a*代表以a开头的所有变量
- save(’…’ , ‘format’):
指定保存文件的格式: MAT/ASCII/…
二、数据导入
1.load( )
在MATLAB中,导入数据通常由load()实现
该函数的用法如下:
-
load:
a. "matlab.mat"文件存在:导入其中的所有变量
b.“matlab.mat”不存在:返回error -
load filename:
将filename中的所有变量导入到工作区 -
load filename X Y Z…:
将filename中的变量X,Y,Z等导入到工作区中
如果 文件为MAT文件: 指定变量是可以使用通配符 ‘ * ’ -
load filename -regexp expr1 expr2…:
通过正则表达式指定需要导入的变量 -
load-ascii filename:
无论输入文件名是否包含有扩展名,将其以ASCII格式导入,如果指定的文件不是数字文本,则返回error。 -
load-mat filename:
无论输入文件名是否包含有扩展名,将其以mat格式导入,如果指定的文件不是MAT文件,则返回error。
2.importdata( )
在MATLAB中,另一个导入数据的常用函数为 importdata(),与load()函数不同,importdata()将文件中的数据以结构体的方式导入到工作区中。该函数的用法如下:
- importdata(‘filename’)
将filename中的数据导入工作区 - A =importdata(’'filename)
将filename中的数据导入到工作区中,并保存为变量A。 - importdata(‘filename’, ‘delimiter’):
将filename中的数据导入到工作区中,以 ‘delimiter’ 指定的符号作为分隔符。
看一个例子:
EXAMPLE:
Day1 Day2 Day3 Day4 Day5 Day6 Day795.01 76.21 61.54 40.57 5.79 20.28 1.5323.11 45.65 79.19 93.55 35.29 19.87 74.6860.68 1.85 92.18 91.69 81.32 60.38 44.51
导入该文件并指定空格分隔符和单个列标题
>>filename = 'myfile01.txt';
>>delimiterIn = ' ';
>>headerlinesln = 1;
>>A = importdata (filename , delimiterln , headerlinesIn);
>>for k = [3,5]
disp(A.colheaders{1,k})
disp(A.data(:,k))
disp(' ')
>>end
Day3
61.5400
79.1900
92.1800
Day5
5.7900
35.2900
81.3200
三、文件的打开
在MATLAB中,可以使用open命令打开各种格式的文件,MATLAB会自动根据文件的扩展名选择相应的编辑器
用法如下
- open(‘filename’):
打开一个指定的文件
>>open copyfile.m
>>open ('D:\temp\data.mat')
需要注意open和load的区别:
>> open('filename.mat'; %将file以结构体的方式打开在工作区中
>> load('filename.mat')%将file中的变量导入到工作区
如果要访问其中的内容,需要用不同的格式进行
四、文本文件的读写
文本文件的读写函数:
函数 | 功能 |
---|---|
csvread | 读入以都逗号分隔的数据 |
csvwrite | 将数据写入文件,数据之间用逗号分隔 |
dlmread | 将以ASCII码分隔的数值数据读入到矩阵 |
dlmwrite | 将矩阵数据写入到文件中,用ASCII分隔 |
textread | 从文本文件中读入数据,将结果分别保存 |
textscan | 从文本文件中读入数据,将结果保存为单元数组 |
- fscanf():
读取ASCII文本文件的用法如下:
A = fscanf( fid, format);
从fid指定的文件读取所有数据,将他转换为format指定的格式,并将结果返回到矩阵A中。
fid: 整数型文件标识符,从fopen操作中获得;
** EXAMPLE: **
创建一个包含温度值的示例文本文件。
str = '78°C 72°C 64°C 66°C 49°C';
fileID = fopen('temperature.dat','w');
fprintf(fileID , '%s' , str);
fclose(fileID);
读取文件中的数字并跳过文本 °C。此外,还返回 fscanf 读取的值数。扩展的 ASCII 代码 176 表示度数符号。
fileID = fopen('temperature.dat','r');
degrees = char(176);
[A , count ] = fscanf( fileID . ['%d' degrees 'C'])
fclose(fileID);
- csvread():
csvread() 函数读取逗号分隔值的文件
csv文件:Comma seperated:逗号分隔符文件
用法如下
- M = csvread(‘filename’)
将文件中的数据读入,并保存为M;
数据文件中只能包含数字,数字之间以逗号分隔;
M是一个数组,行数与filename相同,列数为filename最大值;
对于元素不足的行,补零。 - M = csvread(‘filename’ , row , col)
读取文件中的数据;
起始行为 row,起始列为col。
需要注意的是,此时的行列从0开始。 - M = csvread(‘filename’ , row , col , range)
取文件filename中的数据,起始行为row,起始列为col,
读取的数据由数组range指定,range的格式为 [R1 C1 R2 C2],
其中,R1、C1为读取区域左上角的行和列,R2、C2为读取区域右下角的行和列。
EXAMPLE
>csvlist.dat
02, 04, 06, 08
03, 06, 09, 12
05, 10, 15, 20
07, 14, 21, 28
> M = csvread('csvlist.dat', 2 , 0)
M =
5 10 15 20
7 14 21 28
> M = csvread('csvlist.dat' , 1 , 0 .[1,0,2,2] )
M =
3 6 9
5 10 15
-
dlmread():
dlmread()函数读取以ASCII分隔值的文件。用法如下:- M = dlmread(‘filename’)
- M = dlmread(‘filename’ , delimiter)
- M = dlmread(‘filename’,delimiter , R ,C )
- M = dlmread(‘filename’ , delimiter , range)
其中,参数delimiter()用于指定文件中的分隔符
其他参数的意义与csvread()函数中参数的意义相同
dlmread()函数与csvread()函数的差别在于,
dlmread()函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。 -
dlmwrite():
dlmwrite()函数将矩阵数据写入以ASCII分隔值的文件中。用法如下:- dlmwrite(‘filename’, M) 将矩阵M的数据写入文件filename中,默认以逗号分隔;
- dlmwrite(‘filename’, M, ‘D’) 将矩阵M的数据写入文件filename中,采用指定的分隔符D分隔数据,如果需要 tab 键,可以用 “\t” 指定;
- dlmwrite(‘filename’, M, ‘D’, R, C): 指定写入数据的起始位置;
- dlmwrite(‘filename’, M, attribute1, value1, attribute2, value2, …):
指定任意数目的参数,可以指定的参数如表所示; - dlmwrite(‘filename’, M, ‘-append’):
如果filename指定的文件存在,在文件后面写入数据,不指定时则覆盖原文件。 - dlmwrite(‘filename’, M, ‘-append’, attribute-value list):
叙写文件,并指定参数。 - textread、textscan:当文件的格式已知时,可以利用 textread() 函数和 textscan() 函数读入。
参数名 | 功能 |
---|---|
delimiter | 用于指定分隔符 |
newline | 用于指定换行符,可以选择‘’pc‘’ or ‘’unix‘’ |
roffset | 行偏差:指定文件第一行的位置,基数为0 |
coffset | 列偏差:指定文件第一列的位置,基数为0 |
precision | 指定精确度,可以指定精度维数 ,或者采用c语言的格式,如:“%10.5f” |
EXAMPLE
> X = magic(3) ;
> dlmwrite('myfile.txt' , [X*5 X/5], ' ')
> dlmwrite('myfile.txt' , X , '-append' , 'roffset', 1 , 'delimiter' , ' ' )
> type myfile.txt
40 5 30 1.6 0.2 1.2
15 25 35 0.6 1 1.4
20 45 10 0.8 1.8 0.4
8 1 6
3 5 7
4 9 2
> M = dlmread('myfile.txt')
%实现:
> filename = 'dlmlist.txt';
> M = dlmread('filename')
M =
10.0000 27.7000 12.4000 12.0000
11.0000 26.9000 13.5000 18.0000
12.0000 27.4000 16.9000 31.0000
13.0000 25.1000 12.7000 29.0000
> M = dlmread('dlmlist.txt',' ',[3 0 4 3])
M =
12.0000 27.4000 16.9000 31.0000
13.0000 25.1000 12.7000 29.0000
五、低层文件I/O操作
1. 打开和关闭文件
打开和关闭文件分别使用fopen()、fclose()函数。
fopen()
- fid = fopen(filename)
打开文件名为filename的文件,用于读/写,返回一个integer类型的文件标识fid。
文件标识符号fid是一个整型数值,MATLAB分别识别文件标识符
fid为0是标准输入、1是标准输出(屏幕)和2是标准错误。
如果fopen ()函数打不开文件,fid = -1。
如果fopen()函数打开文件成功,fid大于或等于3。
- fid = fopen(filename , permission )
permission是一个字符串,描述访问的文件类型的字符串:
读取、写入、追加或更新,指定是以二进制或文本模式打开文件。
permission | 意义 |
---|---|
‘r’ | 默认,打开一个文件,用于读 |
‘w’ | 打开或生成一个新文件,用于写 |
‘a’ | 打开或创建新的文件,将数据追加到文件的末尾 |
‘r+’ | 打开文件用于读写 |
‘w+’ | 打开或创建新的文件,用于读和写。如果有的话放弃现有内容。 |
‘a+’ | 打开或创建新的文件,用于读和写。将数据追加到文件的末尾 |
‘A’ | 追加文件,不自动刷新 |
‘W’ | 写文件,不自动刷新 |
- fid = fopen(filename , permission , machineformat)
machineformat是一个串,指定文件以字节或位读/写的次序,用于不同的操作系统。 - [fid , message] = fopen(filename, …)
message是依赖不同操作系统所提供的出错信息。 - fid = fopen(‘all’)
fid 是一个向量,代表所有打开文件的标识。 - [filename, permission, machineformat] = fopen(fid)
返回所打开文件的各种信息。
fclose()
- status = fclose(fid)
此处的fid的意义与fopen()函数中的意义相同,即把在fopen()函数中以文件标识符号为fid的文件关闭。 - status = fclose(‘all’)
- 此处的all的意义与fopen()函数中的意义相同,即把在fopen()函数中以文件标识符号为fid的列向量所代表的所有文件关闭。
2. 文件定位和状态
文件定位和状态使用feof()、fseek()、ftell()、ferror()、frewind()等函数,使用方法与C语言相同
3.二进制文件的读写
(1)fread
从fid指定的文件中读取二进制格式数据到矩阵A,
在调用fread之前先使用fopen打开文件。
- A = fread(fid)
参数fid 是整数型文件标识符,从fopen操作中获得
MATLAB从头到尾完整读取该文件,然后将文件指针定位在文件的末尾。
- A = fread(fid,count)
count是一个可选项,指定读取的元素数,如果不指定该参数,则读取整个文件。
- A = fread(fid,count,precison)
字符串precision指定文件所读取的精度格式,默认为无符号的字符格式uchar。
- A = fread(fid,count,precison,skip)
如果包括一个可选项skip参数,指定读取每个precision值后要跳过的字节数。
如果precision指定一个位格式,如 ‘bitN’ 或 ‘ubitN’,skip参数将被解释为跳过的位数。
- A = fread(fid,count,precison,skip,machineformat)
- [A, count] = fread(…)
(2) fwrite(fid,A,precision):
从文件中写二进制数据。语法如下:
- count = fwrite(fid,A,precision):
把矩阵 A 的元素,以precision指定的精度写入fid指定的文件。count保持成功写入的元素数目。
EXAMPLE:
获取文本文件中的所有内容,并在电脑上显示:数据文件poem.txt
fn = input('filename:' ,'s');
fh = fopen(fn, 'r' );
In = ‘’;
while ischar( In )
In = fgets( fh );
if ischar( In )
fprintf( In );
end
end
fclose( fh );
读取文本文件内容,并提取所有词语构建一个元胞数组.
fn = input( 'file name: ' , 's' );
fh = fopen( fn, 'r' );
ln = '';
while ischar( ln )
ln = fgetl( fh );
if ischar( ln )
ca = [];
while ~isempty( ln )
[tk, ln] = strtok( ln );
ca = [ca {tk}];
end
disp( ca );
end
end
fclose( fh );
读取文本文件内容,写入另一个文件
六、Excel文件操作——xlsread
- num = xlsread(filename)
读取 filename Excel表格工作表中的第一张
并在一个矩阵num中return数据。 - num = xlsread(filename, sheet)
读取指定的工作表。 - num = xlsread(filename, xlRange)
从工作簿的第一个工作表的指定范围内读取数据
使用 Excel 范围语法,例如 ‘A1:C3’。 - num = xlsread(filename, sheet, xlRange)
读取指定的工作表和范围。 - [num,txt,raw] = xlsread(—)
使用先前语法中的任何输入参数
在元胞数组 txt 中返回文本字段
在元胞数组 raw 中返回数值数据和文本数据。
[num,txt,raw] = xlsread(___)
num:数字
txt:文本
raw:表格形式
- [num,txt,raw,custom] = xlsread(filename, sheet, xlRange, ‘’,processFcn )
processFcn 是函数句柄
读取电子表,对数据调用 processFcn,并在数组 num 中以数值数据的形式返回最终结果。
xlsread 函数在元胞数组 txt 中返回文本字段、
在元胞数组 raw 中返回数值和文本数据,
并在数组 custom 中返回 processFcn 的第二个输出。
EXAMPLE
创建一个名为 myExample.xlsx 的 Excel 文件。
values = {1, 2, 3 ; 4, 5, 'x' ; 7, 8, 9};
headers = {'First','Second','Third'};
xlswrite('myExample.xlsx',[headers; values]);
filename = 'myExample.xlsx';
A = xlsread(filename)
[num,txt,raw] = xlsread('myExample.xlsx')
———————————————————————————
Conclusion
文件 | 内容 | Reader | Writer | 数据类型 | 扩展名 |
---|---|---|---|---|---|
文本 | 任何内容 | textscan | fprintf | 函数调用中特制的 | .txt (通常) |
CSV | 逗号分隔 | csvread | csvwrite | double array | .csv |
分隔符 | 数字+分隔符 | dlmread | dlmwrite | double array | .txt (通常) |
Excel表格 | 微软特制的 | xlsread | xlswrite | double array & 2cell array(二double元胞数组) | .xls |
图像 | 各种 | imread | imwrite | 真彩色、灰度或索引图像 | 各种 |
语音 | * | audioread | audiowrite | 声音数据和采样率 | * |
视频 | AVI | aviread | – | 影片 | .avi |
*: matlab 支持的语音文件的内容为:
.wav & .mp3 & .flac & .ogg