matlab 文件读取、查询等命令汇总

1. 打开 fopen

打开文件或者得到文件打开的信息

f=fullfile('D:','Matlab','example.txt');
fid=fopen(f);  %打开文件,fid=-1表示打开文件失败;fid=1表示输出stdout;fid=2 表示错误信息文件;
			   %fid=其他正数表示文件打开成功,并返回文件编号。(fid=1,2不需打开)
fid=fopen(f,'r');  %以读(r)的方式打开文件;打开方式有:r,  w,  a,  r+,  w+,  a+,  A,  W
[fid,message]=fopen(filename,  mode,  machineformat);

2. 关闭 fclose

关闭一个或者多个文件

fclose(fid);
fclose(‘all’); 

3. 读取 load

用于读数值型文件,并且无须打开文件,但是要求文件中的内容所有行的列数相同

f=fullfile('D:','Matlab','example.txt');  
A=load(f)    %返回以f为路径的文件的内容 

4. 读取 fread

用于读取文件中的内容,返回的是ASCII码,可指定返回字节数和返回的格式

f=fullfile('D:','Matlab','example.txt');
fid=fopen(f, 'r');  
a=fread(fid);  %读取文件全部内容,返回的是每个字节的ASCII码

b=fread(fid,5);  %读取文件中的前5个字符返回的是这5个字节的ASCII码  
c=fread(fid,5,  'uint8=>char');  %读取文件中前5个字符并以字符char格式返回  
d=fread(fid,'*char');    %读取文件中全部内容并以字符串的格式返回  (a,b,c,d每句是一个单独语句与其他语句无关)
e1=fread(fid,5,'*char');  %读取文件中前5个字符并以字符串的格式返回
e2=fread(fid,8,'*char');  %读取fid指向位置开始后面的8个字符并以字符串的格式返回(e2与e1一起使用时)
fclose(fid)

5. 读取 fscanf

用于读取文件中指定格式的内容,可指定读取的字节数,返回的内容存放至一维数组

f=fullfile('D:','Matlab','example.txt'); 
fid=fopen(f, 'r');
a=fscanf(fid,'%d');  %读取文件中的所有数字,返回到数组a中
[a,count]=fscanf(fid,'%d',5);  %读取文件中fid指向位置开始后面的5个数字,返回到数组a中;
							   %count返回a的大小,count<=5(返回的数字个数可能小于要求读取的个数)
fclose(fid)

A=fscanf(fid,format)
[A,count]=fscanf(fid,format,size)
[A,count]=fscanf(fid,format,size)

data = fscanf(fid,format,size);

data : 读取内容的数组。大小由size决定

fid : fopen打开文件的返回值

size : [m n]的向量,m为行,n为列 (按列优先排列),若n取 inf 表示读到文件末尾。例:data[2, 3]即为2行3列;如果size为[4inf],则data为4行n列、且data数据先按列填满4个后再换一列。

format : 格式化参数(像printf、scanf),format 包含txt内所有类型,%*d表示省略整型数据,例子一:

% test.txt
0.00    good 2
0.10    bot  3
1.02    yes  4
1.00    yes  5
1.00    yes  6
1.00    yes  3
1.00    yes  5
1.00    yes  6
1.00    yes  1
1.00    yes  3
1.00    yes  7
1.00    yes  3
1.00    yes  2

fid =fopen('.\test.txt', 'r');
a = fscanf(fid,'%f    %*s %d ', [2 inf])   % It has two rowsnow.
fclose(fid)

一列和二列间有四个空格,format也需有四空格;有三列即三种类型,要有三种format,%*s即为不输出字符串型。结果:

a = Columns 1 through 11
0   0.1000   1.0200   1.0000   1.0000   1.0000   1.0000   1.0000   1.0000   1.0000   1.0000
2.0000   3.0000   4.0000   5.0000   6.0000   3.0000   5.0000   6.0000   1.0000   3.0000   7.0000
    Columns 12 through 13
1.0000   1.0000
3.0000   2.0000

例子二:

% moon.txt
13, 1, 3.4
3, 2.1, 23
1, 12, 2
4, 5.4, 6

% 读取moon中的数据存在一个数组里
fid=fopen(‘d:\moon.txt’);
data=fscanf(fid,%f,%f,%f’,[3,inf]);%这里得用单引号
fclose(fid);

13 3 1 4
1 2.1 12 5.4
4 23 26 

当需要用引用数组中的某行或某列来画图,方法是data(m,:) 或 data(:,n),即取得data数组的第m行或第n列。

6. 读取 fgetl

用于读取文件中一行内容,不包括换行符

f=fullfile('D:','Matlab','example.txt');  
fid  =  fopen(f,  'r');  
tline=fgetl(fid); %从文件中读取fid指向的一行内容
fclose(fid)

7. 读取 fgets

用于读取文件中一行内容(包括换行符),只能用于文本文件

f=fullfile('D:','Matlab','example.txt'); 
fid  =  fopen(f,  'r');  
tline=fgets(fid);    %返回文件标识符指向的一行  
tline=fgets(fid,nchar);    %返回文件标识符指向的一行的最多nchar个任何字符  
fclose(fid)

8. 写入 fwrite

用于将二进制数据写入文件中

fwrite(fid,magic(5),'integer*4');    %创建一个二进制文件,由25个4位integer类型的元素组成的5*5的矩阵
fclose(fid)

9. 设定 fprintf

用于将指定格式数据写入到文件中

x  =  0:.1:1;  %从0到1以0.1为单位建立一个矩阵
y  =  [x;  exp(x)];
f=fullfile('D:','Matlab','example.txt'); 
fid  =  fopen(f,'w');
fprintf(fid,'%6.2f  .8f\n',y);    %将矩阵y写入文件中,规定了写入格式
fclose(fid)

10. 设定 fseek

用于对文件指针位置的设定

f=fullfile('D:','Matlab','example.txt');  
fid  =  fopen(f,'r');  
fseek(fid,  19,  'bof');  
A  =  fscanf(fid,%d’,5);
fclose(fid) 

11. 获取 ftell

用于得到文件指针位置

f=fullfile('D:','Matlab','example.txt');  
fid  =  fopen(f,'r');  
fseek(fid,0,’eof’);  
position=ftell(fid);  
fclose(fid) 

12. 查询 ferror

用于查询关于文件错误的输入或者输出

f=fullfile('D:','Matlab','example.txt');  
fid=fopen(f,'r');
message1=ferror(fid);    %返回错误信息
message2=ferror(fid,’clear’) %返回错误信息并清空
fclose(fid) 

13. 判断 feof

用于判断是不是文件末尾

f=fullfile('D:','Matlab','example.txt');  
fid=fopen(f,'r');  
while  ~feof(fid)  
	tline=fgetl(fid);  
	printf(tline);  
end
fclose(fid)

14. 文件查找 dir(a)

用于查询关于a的文件信息,a是文件夹或文件名

dir(‘fk’),表示查询当前路径上名为 fk 的文件或文件夹
若 fk 不存在,则返回

fk not found.

否则返回相应信息:

1.hdr  ki     ku (表示 fk 是一个文件夹,其中还包含有1.hdr,ki 和 ku 等文件和文件夹).
还可以查找特定后缀的文件: 如:dir(['fk\','*.jpg'])表示查找 fk文件夹下后缀为 ' .jpg' 的文件
若存在后缀为'.jpg' 的文件,则返回文件名:ABC.jpg; 否则返回:fk.\*.jpg not found.



15. 创建 mkdir

用于创建文件夹

mkdir(' fj '% 表示在当前路径创建名为 fj 的文件夹
mkdir(' fj\fi '%表示在当前路径下的 fj 文件夹里创建 fi 子文件夹

16. 删除 rmdir

用于删除文件夹

rmdir('fl'%表示删除当前路径下名为 fl 的文件夹
rmdir('fl', 's') %表示删除非空文件夹

17. 删除 delete

用于删除文件

delete(filename)	% 删除一个文件
delete('*.后缀')	% 删除一类文件

18. 文件移动和复制

movefile('a.txt' , 'b.txt' );   % 把1.txt剪切成11.txt(1.txt不存在了),实际上相当于改名 
copyfile('c.txt', 'd.txt');    %把c.txt复制成d.txt(c.txt依旧存在)

movefile('a.txt', aDir);   %把a.txt剪切到文件夹aDir中
copyfile('c.txt', bDir);    %把c.txt复制到文件夹bDir中


文件读取

1. load

用 load命令读取数据后在Matlab中数据变量和文件同名。如使用“load data.txt”后数据变量名即为data。若文件为二进制格式,可用load命令直接读取;若是文件为ASCII格式,需保证数据整齐性

% Load(每一行数据个数要一致),否则会出错。
如下述三行的data.txt文件(ASCII格式)使用“load data.txt”将会出错。
0 1
1 2 3
0
 
data1.txt文件 能顺利读入3*3矩阵
0 1 2
1 2 3
2 3 4

与 load 相对应的写数据命令为save,一般存为.mat文件,格式为二进制

2. importdata

根据文件名将数据导入到Matlab工作区。导入的数据(包括字符串和数值)以结构形式存放在工作区; 可以导入load不能读取的长短不一的ASCII文件。当文件中既包含字符串又包含数值,而且数值长度个数不一时,可以使用importdata命令。注意读取的数值矩阵列数以文件中数值第一行的列数为标准。

例 test.txt

This is a test.
Start
0 1 2
1 2
1 2 3 4

A=importdata('test.txt')
A =
    data: [4x3 double]
    textdata: {2x1 cell}
 
A.data =
     0     1     2
     1     2   NaN
     1     2     3
     4   NaN   NaN
 
A.textdata =
    'This is a test.'
    'Start'
 
另外,读取的字符串只能位于数值之前,位于数值之后的将被忽略。

例:test.txt
0 1 2
1 2
1 2 3 4
End.

A=importdata('test.txt')
A =
     0     1     2
     1     2   NaN
     1     2     3
     4   NaN   NaN

3. fopen

打开一个文件并创建文件标识以供接下来的读写等操作。fopen命令本身不进行读操作。然后可以使用fscanf读取数据,根据需要对数据进行筛选编辑。

f=fullfile('D:','Matlab','example.txt');
fid=fopen(f);  %打开文件,fid=-1表示打开文件失败;fid=1表示输出stdout;fid=2 表示错误信息文件;
			   %fid=其他正数表示文件打开成功,并返回文件编号。(fid=1,2不需打开)
fid=fopen(f,'r');  %以读(r)的方式打开文件;打开方式有:r,  w,  a,  r+,  w+,  a+,  A,  W
[fid,message]=fopen(filename,  mode,  machineformat);

data.txt
0 1 2
1 2 3
1 2 3
End.
 
fid=fopen('data.txt');    %打开文件,创建文件标识
A=fscanf(A,'%c');         %读取数据
fclose(fid);              %关闭文件标识
i=findstr(A,'End');       %查找标识
B=A(1:i-3);               %提取数据,换行为2个字符
C=str2num(B);             %将数据转换成数值矩阵

A =
0 1 2
1 2 3
1 2 3

其中str2num同样需要保证数值矩阵中列数一致,如果不一致,则结果为空。
 
例
0 1 2
1 2
1 2 3
End.
 
C=[]

% 例:读取行的方法
fid1=fopen('data.txt');
fid2=fopen('numbers.txt','w'); % numbers.txt 为按行保存的数值文件
while ~feof(fid1)
    aline=fgetl(fid1);
    if double(aline(1))>=48&&double(aline(1))<=57
        fprintf(fid2,'%s\n',aline);
        continue
    end
end
fclose(fid1);
fclose(fid2);


4. textscan

从文本文件或字符串读取格式化数据;因兼容性等其他问题已不推荐使用 textread

C = textscan(fileID,formatSpec) 
将已打开的文本文件中的数据读取到元胞数组 C。该文本文件由文件标识符 fileID 指示。使用 fopen 可打开文件并获取 fileID 值。
完成文件读取后,请调用 fclose(fileID) 来关闭文件。textscan 尝试将文件中的数据与 formatSpec 中的转换设定符匹配。
textscan 函数在整个文件中按 formatSpec 重复扫描数据,直至 formatSpec 找不到匹配的数据时才停止。

C = textscan(fileID,formatSpec,N) 
按 formatSpec 读取文件数据 N 次,N 是为正整数。要在 N 个周期后从文件读取其他数据,使用原 fileID 再次调用 textscan进行扫描。
如果通过调用具有相同文件标识符 (fileID) 的 textscan 恢复文件的文本扫描,则 textscan 将在上次终止读取的点处自动恢复读取。

C = textscan(chr,formatSpec) 
将字符向量 chr 中的文本读取到元胞数组 C 中。从字符向量读取文本时,对 textscan 的每一次重复调用都会从开头位置重新扫描。
要从上次位置重新开始扫描,需要指定 position 输出参数。textscan 尝试将字符向量 chr 中的数据与formatSpec 中指定的格式匹配。

C = textscan(chr,formatSpec,N) 按 formatSpec N 次,其中 N 是一个正整数。

C = textscan(___,Name,Value) 支持上述语法中的任何输入参量,且可使用一个或多个 Name,Value 对组参量指定选项。

[C,position] = textscan(___) 在扫描结束时返回文件或字符向量中的位置作为第二个输出参量。对于文件,该值等同于调用 textscan 后
再运行 ftell(fileID) 所返回的值。对于字符向量,position 指示 textscan 读取了多少个字符。
1:mydata1.txt文件如下
Sally Level1 12.34 45 1.23e10 inf Nan Yes 5.1+3i
Joe   Level2 23.54 60 9e19-inf  0.001 No2.2-.5i           
Bill  Level3 34.90 122e5   10 100   No 3.1+.1i

fid =fopen('mydata1.txt');
C = textscan(fid,'%s%s�2�%u%f%f%s%f');
fclose(fid);
C =
  Columns 1 through 5
    {3x1cell}    {3x1cell}    [3x1single]    [3x1int8]    [3x1uint32]
    
  Columns 6 through 9
    [3x1double]    [3x1double]    {3x1cell}    [3x1double]

% 输出C为1*9的细胞数组,每个数组中存放每列的数据2:可设置读取长度,具体是,在%和格式符之间插入数字N,代表你要读入几个数值(有点问题)
myfileli6.txt
SallyType1 12.34 45 Yes
Joe Type223.54 60 No
BillType1 34.90 12 No

fid=fopen('myfileli6.txt');
data=textscan(fid,'%s%s%f%f%s',3);	%正常读入数据

str = '0.41 8.24 3.57 6.24 9.27';
C = textscan(str, '%3.1f ');
C =
{
  [1,1] =

     0.4000
     8.2000
     3.6000
     6.2000
     9.3000

}

C = textscan(str, '%3.1f%*1d');
C{1}
ans =
{
  [1,1] =

     0.4000
     0.2000
     0.6000
     0.2000
     0.3000

}3:读取不同格式的数据
scan1.txt
09/12/2005 Level1 12.34 45 1.23e10 inf Nan Yes 5.1+3i
10/12/2005 Level2 23.54 60 9e19 -inf  0.001 No2.2-.5i
11/12/2005 Level3 34.90 12 2e5  10  100   No3.1+.1i

fid = fopen('scan1.dat');
C = textscan(fid, '%s %s �2 � %u %f %f %s %f');
fclose(fid);

% 输出C为一个1*9的细胞矩阵
C{1} = {'09/12/2005'; '10/12/2005'; '11/12/2005'} class cell
C{2} = {'Level1'; 'Level2';'Level3'}   class cell
C{3} = [12.34; 23.54;34.9]             class single
C{4} = [45; 60;12]                     class int8
C{5} = [4294967295; 4294967295; 200000]  classuint32
C{6} = [Inf; -Inf;10]                  class double
C{7} = [NaN; 0.001;100]                class double
C{8} = {'Yes'; 'No';'No'}              class cell
C{9} = [5.1+3.0i; 2.2-0.5i;3.1+0.1i]   class double

C{5}中的4294967295指的是32位系统无符号整型的最大值2^32-1
也可以把C{1}中的内容分别读入
fid = fopen('scan1.txt');
C = textscan(fid, '%f/%f/%f %s �2� %u %f %f %s %f');
fclose(fid);
C{1}
ans =
    9   10    11
    
C{2}
ans =
   12   12    12

C{3}
ans =
       2005       2005       20054:移除字符串
fid = fopen('scan1.txt');
C = textscan(fid, '%s Level%u8 �2� %u %f %f %s %f');
fclose(fid);
C{2}
ans =
   1   2    35:读取某列
fid = fopen('scan1.txt');
dates = textscan(fid, '%s%*[^\n]');
fclose(fid);
dates{1}
ans =
   '09/12/2005'
   '10/12/2005'
   '11/12/2005'
% dates是一个1*1的细胞矩阵
%[^\n] 就是一直读到行尾。

fid = fopen('scan1.txt');
dates = textscan(fid, '%s%[^\n]');
fclose(fid);
dates{1}'
ans =
   '09/12/2005'   '10/12/2005'   '11/12/2005'
   
dates{2}
ans =

    'Level112.34 45 1.23e10 inf Nan Yes 5.1+3i'
    'Level223.54 60 9e19 -inf  0.001 No 2.2-.5i'
    'Level334.90 12 2e5  10  100   No3.1+.1i'

%*[^\n] 就是从当前直接跳到行尾。
% *是一个跳过符号,表示跳过该位6:处理存在空数据; 实用分节符delimiter 和空值符EmptyValue
exm5.txt
1,  2,  3, 4,   ,  6
7,  8, 9,   , 11, 12

fid = fopen('exm5.txt');
C = textscan(fid, '%f %f %f %f %f %f', 'delimiter',',','EmptyValue', -Inf);
fclose(fid);
data=cell2mat(C)
data =
    1    2    3    4 -Inf    6
    7    8    9 -Inf   11    127:跳过所有注释,选择性的把某些输入置 空
exm6.txt
abc, 2, NA, 3, 4
// Comment Here
def, na, 5, 6, 7

现在我们想要第二行的注释,并且把其中的 NA na 置为NAN
fid = fopen('exm6.txt');
C = textscan(fid, '%s %n %n %n %n','delimiter', ',', 'treatAsEmpty', {'NA', 'na'}, 'commentStyle','//');
fclose(fid);
C{1}
ans =
   'abc'
   'def'

C{2:5}
ans =
    2
   NaN
ans =
   NaN
    5
ans =
    3
    6
ans =
    4
    78:处理重复的分隔符,把重复分隔符认为成一个分隔符
exm8.txt
1,2,3,,4
5,6,7,,8
现在我们想把重复分隔符合并认为成单个分隔符,我们采用MultipleDelimsAsOne参数把其设置为1
% multiple 多个  delims 分隔符 as  one
clear
fid = fopen('exm8.txt');
C = textscan(fid, '%f %f %f %f', 'delimiter', ',','MultipleDelimsAsOne', 1);
fclose(fid);
data=cell2mat(C)
data =
    1    2    3    4
    5    6    7    8


大型文件(10万+) 读取文本文件行数

生成数据

data=rand(10000,100); % 随机生成1w行数据
save data.csv data -ascii % 保存为文本
for ii=1:5 % 自己复制5次,生成2^5=32万行
	% 这里使用了dos命令,效率会好些
   !type data.csv >>data.csv
end

1. fgetl 或 fgets函数
对文本按行读取,然后对行数进行累加。

fid=fopen('data.csv'); % 打开文件
row=0;
while ~feof(fid) % 是否读取到文件结尾
    [~]=fgets(fid); %或者fgetl
    row=row+1; % 行数累加
end
fclose(fid); 

fgets 大概耗时大概10s,fgetl 速度会慢一些大概需要13s

2. textscan 函数
前面有介绍 此处不表 虽然textscan的效率很高 但并不适合用于统计大型文件的行数
textscan是一行一行的处理和读取数据文件,只是读取第一个字符然后忽略了剩下的所有字符

3. fread函数
默认处理的是二进制文件

fid=fopen('data.csv','rt'); % t是告诉fread是这里文本文件
row=0;
while ~feof(fid)
    %一次性读取10000字符,计算其中的回车个数,其中10是回车的ASCII编码
    %'*char'表示每次读取一个字符,*表示输出也是字符
    %放心fread现在已经可以自动识别中文了,万一还是识别不了,
    % 请在fopen中指定文件编码格式,比如gbk
   row=row+sum(fread(fid,10000,'*char')==char(10));
    %下面还有一个类似的方法,但是效率低很多,大概是上面的一半
    %'char'表示每次读取一个字符,但是默认输出double,
    %也就是说读取char然后转换double中间有转换能快吗?
    %row=row+sum(fread(fid,10000,'char')==10);
end
fclose(fid);

获取文件长度(字符个数)

fid=fopen('data.csv');
fseek(fid,0,'eof')
filelength = ftell(fid);
fclose(fid);


批量读入数据文件

1、文件夹下的文件名称有规律

要读入的文件下的文件名称依序列的方式命名,如 a1b.mat, a2b.mat, …, ajb.mat

filepath='____ '; 
for i=1:n  %n是要读入的文件的个数
    load([filepath 'a' num2str(i) 'b' '.mat'])
end

2、文件夹下的文件名称无规律

文件夹内是n幅图像(jpg类型) 和其他类型数据,要读取所有图像

di= dir('文件路径\*.jpg')for k= 1:length(di)
    I(k,:,:) = imread(['文件路径',di(k).name]);
end
Matlab读取文件的函数有textread、load和xlsread等。其中,textread函数用于读取txt文档,其基本语法是:\[A,B,C,...\] = textread(filename,format)或\[A,B,C,...\] = textread(filename,format,N)。load函数用于读取.mat文件,其语法是:load(filename)或load(filename,variables)。xlsread函数用于读取Excel文件,其语法是:\[num,txt,raw\] = xlsread(filename)。这些函数可以根据不同的文件类型和需求进行选择和使用。 #### 引用[.reference_title] - *1* [Matlab读取txt文件中的数据(使用textread函数)](https://blog.csdn.net/Wekic/article/details/109378870)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Matlab常用函数集合(各类文件读取/保存、数据转换、处理)——持续更新中](https://blog.csdn.net/qq_42109740/article/details/124845166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MATLAB——读写文件函数命令汇总](https://blog.csdn.net/yunqianrui/article/details/104336931)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值