【MATLAB】第六章 文件操作

第六章 文件操作

这一章的内容是关于文件的操作、数据的存储,我们会涉及的内容有:

  1. 文件数据的存储;
  2. 数据导入
  3. 文件的打开
  4. 文本文件的读写
  5. 低层文件的I/O操作
  6. EXCEL的文件操作

今天的自学笔记可能会略长

一、文件、数据的存储

1.保存整个工作区

如果想长久保存MATLAB工作区(workspace)的数据,我们要生成.MAT数据文件:
方法:

  • 点击“File”菜单中的“Save Workspace As…”
  • 点击工作区浏览器工具栏中的“Save”按钮

2.保存工作区中的变量

  • 工作区浏览器中,右键单击需要保存的变量名,选择“Save As…”菜单项,将该变量保存为MAT文件

3.使用save 命令保存

  1. save filename…
    • 保存整个工作区到制定的filename文件中
    • 如果不指定扩展名,则默认为.MAT文件
    • 如果不指定文件名,则默认为:“matlab.mat
    • MAT文件可以通过**load()**函数再次导入工作区
save data a b;
load data
  1. 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方式存储资料。

  1. save(‘filename’)
    1)将工作区中的所有变量保存为MAT文件
    2)文件名由filename制定
    3)如果filename中包含路径,则文件保存在相应目录下,否则默认为当前路径

  2. save(‘filename’, ‘var1’, ‘var2’, …):
    保存指定的变量

  3. save(‘filename’ , ‘struct’ , ‘s’):
    保存结构体s中的全部域作为单独的变量

  4. save(‘filename’ , ‘struct’ , ‘s’ , ‘f1’ , ‘f2’,…):
    保存结构体s中的指定变量

定义一个结构体:
s.a = 10; s.b = 1;

  1. save(’-regexp’ , expr1 , expr2):
    通过正则表达式*指定待保存的变量所满足的条件

正则表达式: a*代表以a开头的所有变量

  1. save(’…’ , ‘format’):
    指定保存文件的格式: MAT/ASCII/…

二、数据导入

1.load( )

在MATLAB中,导入数据通常由load()实现
该函数的用法如下:

  1. load:
    a. "matlab.mat"文件存在:导入其中的所有变量
    b.“matlab.mat”不存在:返回error

  2. load filename:
    将filename中的所有变量导入到工作区

  3. load filename X Y Z…:
    将filename中的变量X,Y,Z等导入到工作区中
    如果 文件为MAT文件: 指定变量是可以使用通配符 ‘ * ’

  4. load filename -regexp expr1 expr2…:
    通过正则表达式指定需要导入的变量

  5. load-ascii filename:
    无论输入文件名是否包含有扩展名,将其以ASCII格式导入,如果指定的文件不是数字文本,则返回error

  6. load-mat filename:
    无论输入文件名是否包含有扩展名,将其以mat格式导入,如果指定的文件不是MAT文件,则返回error

2.importdata( )

在MATLAB中,另一个导入数据的常用函数为 importdata(),与load()函数不同,importdata()将文件中的数据以结构体的方式导入到工作区中。该函数的用法如下:

  1. importdata(‘filename’)
    将filename中的数据导入工作区
  2. A =importdata(’'filename)
    将filename中的数据导入到工作区中,并保存为变量A。
  3. 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从文本文件中读入数据,将结果保存为单元数组
  1. 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);

在这里插入图片描述

  1. 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
  1. 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()函数在读入数据时可以指定分隔符,不指定时默认分隔符为逗号。

  2. 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

文件内容ReaderWriter数据类型扩展名
文本任何内容textscanfprintf函数调用中特制的.txt (通常)
CSV逗号分隔csvreadcsvwritedouble array.csv
分隔符数字+分隔符dlmreaddlmwritedouble array.txt (通常)
Excel表格微软特制的xlsreadxlswritedouble array & 2cell array(二double元胞数组).xls
图像各种imreadimwrite真彩色、灰度或索引图像各种
语音*audioreadaudiowrite声音数据和采样率*
视频AVIaviread影片.avi

*: matlab 支持的语音文件的内容为:
.wav & .mp3 & .flac & .ogg

下一章:数值计算
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值