matlab fopen,fread,fseek 与python open, read, seek函数之间的转换

最近被老师要求将一份matlab代码转为python代码,之前并没有系统学习过matlab,但也知道和python语法相近,因此也并没有感到有太多难度。但是涉及文件操作这部分还是饶了许多弯路,特此做一下记录。

 

首先读取文件中,matlab采用的是fopen函数,其语法格式为 

[fid,message]=fopen(filename,'r');

其中fid如果是一个正整数,表示打开成功,文件代号为fid,message返回空。打开失败则返回-1.message会返回一个错误信息。

文件打开的默认方式为二进制。

而python使用open函数,

fid = open(name, 'rb')

此时创建了一个file对象fid,相关操作都在这个对象方法中。注意这里想打开二进制文件,一定要加b。

接下来是定位,也就是把文件指针移动到文件中的指定位置,matlab使用的是fseek函数,

fseek(fileID, offset, origin)

status=fseek(fid,(4096+(m-1)*4096+temreladdress(n)),'bof')

这里第一个参数就是之前fopen得到的文件代号,第二个参数是要移动的字节数,第三个参数是指定起始位置,‘bof'表示文件开头,’cof'表示文件当前位置,‘eof'表示文件结尾。

当操作成功时,status = fseek(___) 返回 0。否则,fseek 将返回 -1。那么什么时候会操作失败呢,一般是超出了文件的最大字节数时。

而python中使用的是seek函数,其语法如下:

status=fid.seek((4096+(m-1)*4096+temreladdress[n]), 0)

这里status代表当前文件指针所在的字节数,也就是status=(4096+(m-1)*4096+temreladdress[n]),0代表从文件开头开始。

注意这里可以发现matlab与python的区别,python并没有返回值标定是否读取成功,我的实验表明,即使超过了最大字节数,python的status返回的也是那个数字,只不过此时读取的话,读取的是空字节。

最后是读取,matlab使用的是fread函数,

count_1=fread(fid,1,'uint8');

fid代表文件代号,1代表在当前位置开始只读取一个字节,’unit8‘代表转换为uint8格式。注意这个读取是一直进行的,比如我再执行一遍fread函数,那么会读取下一个字符。

而python中读取使用的是read函数,

count_1=fid.read(1)
count_1 = ord(bytearray(count_1))

注意这里读取的count_1,要想转化为uint8,要使用下面的操作,ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。

这里有个要注意的地方,就是上面说的seek函数定位超过文件最大值的时候,读取到空的字节值,此时调用read函数会报错,而matlab不会,因为matlab的fseek返回-1后,就不会移动此时的指针了。所以python的seek在定位时,一定要查看一下是否超过了文件的最大字节数,做一个判断,避免这种bug出现。

关于如果返回当前文件指针所在的字节位置,matlab可以使用ftell函数,而python可以使用tell函数,这里不赘述。

以上就是我自己探索得到的一些理解,因为文档差的不是很全,所以我的理解可能也会有偏差,如果有人可以指出,望不吝赐教。

 

 

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值