python-17-如何读取文本文件?如何处理二进制文件?如何设置文件的缓冲?

本文介绍了Python中如何读取文本文件和处理二进制文件,强调了Unicode在字符串编码中的作用。在Python2与Python3的差异中,解释了字节和字符串的区别。针对二进制文件,讨论了如何获取文件头信息以及数据处理。同时,文章详细阐述了文件的缓冲设置,包括全缓冲、行缓冲和无缓冲的概念,以及它们在不同场景下的应用和效率考虑。
摘要由CSDN通过智能技术生成

这里写图片描述
这里写图片描述
前期由于计算机是由美国人发明的,所以ACSII,一个字节代表一个字符,字符串抽象的是连续的字节。
后来为了支持各国语言,发明了各种编码格式。unicode才是真正意义上的字符串

s = u'你号'
编码(unicode转换成str)
print(s.encode('gbk'))
print(s.encode('utf8'))

四个字节
b'\xc4\xe3\xba\xc5' 
六个字节
b'\xe4\xbd\xa0\xe5\x8f\xb7'

解码
python3默认的文本字符串为unicode格式,因此文本字符串没有decode方法

这里写图片描述

这里写图片描述

python2 中 ‘dadsdasdsa’ 相当于 python3 中 b’dadsdasdsa’
python2 中 u’您好’ 相当于 python3 中 ‘您好’

t文本模式,不用填写,自带。
读取的也是字节,只不过是自动编码和解码
这里写图片描述

处理二进制文件:
这里写图片描述
这里写图片描述

使用read获取头部44个字节:
这里写图片描述

b表示二进制模式

struct.unpack('数据类型','待解析二进制字符串')

这里写图片描述
这里写图片描述
声道数,
采样频率,
采样点用多少个比特编码

这里写图片描述

对于数据,最好不要是字符串形式,因为字符串不能支持数学运算,不方便我们特别处理,最好使用数组存储.

我们首先要获得数据的总长度,就是(文件的总长度-头信息长度)/2

import array

f.seek(0,2)
seek(offset[, whence]) 方法用于移动文件读取指针到指定位置。whence:0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
f.tell()
n = ((f.tell() - 44)/2)

这里写图片描述

把采样缩小一定的程度(声音变小)
这里写图片描述

设置文件的缓冲:
这里写图片描述
这里写图片描述
I/O操作:系统调用->向操作系统申请服务->创建响应,调用硬件的驱动程序
磁盘块设备:读写不是以字节依次读写完成的,但是按照块依次读写完成的。
所以说一个1字节的块和一个4096字节的块都需要I/O操作,用时也是相同的。

  • 全缓冲就是当输入或输出时,当缓冲区被填满了之后,才会进行实际的I/O操作。注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。
  • 当在输入或输出中遇到换行符时,才进行实际I/O操作。Linux下标准输出默认是行缓冲。注意,当流涉及终端的时候,通常使用的是行缓冲。
  • 标准I/O库不进行任何字符缓冲,任何读写都是即时可见的。注意,标准出错流stderr通常是无缓冲的。
tail -f demo.txt来观察文件内容

f = open('demo.txt','w')
f.write('abc')
写入到缓冲区当中,通常一个块是4096个字节。
f.write('+'*4093)
还是没有输出,刚刚好4096个字节
f.write('1')
输出了,如图。这就是普通文件默认的输出行为。

这里写图片描述

f = opne('demo2.txt','w',buffering=2048)
f.write('+' * 2047)
没反应
f.write('-' * 2)

这里写图片描述

行缓冲行为:

f = opne('demo3.txt','w',buffering=1)
f.write('+' * 10)
没反应
f.write('-' )
没反应
f.write('\n')
写入磁盘

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值