一, Python 文件读写的几种模式:
r,rb,w,wb 那么在读写文件时, 有无 b 标识的的主要区别在哪里呢?
1, 文件使用方式标识
'r': 默认值, 表示从文件读取数据.
'w': 表示要向文件写入数据, 并截断以前的内容
'a': 表示要向文件写入数据, 添加到当前内容尾部
'r+': 表示对文件进行可读写操作(删除以前的所有数据)
'r+a': 表示对文件可进行读写操作(添加到当前文件尾部)
'b': 表示要读写二进制数据
2, 读文件 进行读文件操作时, 直到读到文档结束符 (EOF) 才算读取到文件最后, Python 会认为字节 \ x1A(26)转换成的字符为文档结束符(EOF),
故使用'r'进行读取二进制文件时, 可能会出现文档读取不全的现象.
示例:
二进制文件中存在如下从低位向高位排列的数据: 7F 32 1A 2F 3D 2C 12 2E 76
如果使用'r'进行读取, 则读到第三个字节, 即认为文件结束.
如果使用'rb'按照二进制位进行读取的, 不会将读取的字节转换成字符, 从而避免了上面的错误.
解决方案:
二进制文件就用二进制方法读取'rb'
总结:
使用'r'的时候, 如果碰到'0x1A', 就视为文件结束, 就是 EOF. 使用'rb'则不存在这个问题,
即: 如果你用二进制写入再用文件读出的话, 如果其中存在'0x1A', 就只会读出文件的一部分,
使用'rb'会一直读取文件末尾.
3, 写文件 对于字符串 x='abc\ndef', 我们可用 len(x)得到它的长度为 7,\n 我们称之为换行符, 实际上是 0x0A. 当我们用'w'即文本方式写的时候, 在 Windows 平台上会自动将'0x0A'变成两个字符'0x0D','0x0A', 即文件长度实际上变成 8. 当用'r'文本方式读取时, 又自动的转换成原来的换行符. 如果换成'wb'二进制方式来写的话, 则会保持一个字符不变, 读取的时候也是原样读取. 所以如果用文本方式写入, 用二进制方式读取的话, 就要考虑这多出的一个字节了.'0x0D'也称回车符. Linux 下不会变, 因为 Linux 只使用'0X0A'来表示换行.
来源: http://www.bubuko.com/infodetail-3100994.html