TypeError: write() argument must be str, not bytes报错原因及Python3写入二进制文件方法

博客主要围绕Python文件操作展开。Python3给open函数添加encoding新参数,默认值为‘utf - 8’,导致用Python3随机写入二进制文件报错。解决办法是写入用‘wb’模式,读取用‘rb’模式。还提到了同时适配Python3和Python2的方法,以及给出了各文件操作符含义的参考链接。

1.解决办法:

转自:https://blog.youkuaiyun.com/kingyuan666/article/details/81214954

Python2随机写入二进制文件:

with open('/python2/random.bin','w') as f:
    f.write(os.urandom(10))

但使用Python3会报错:TypeError:must be str, not bytes

原因为:

Python3给open函数添加了名为encoding的新参数,而这个新参数的默认值却是‘utf-8’。这样在文件句柄上进行read和write操作时,系统就要求开发者必须传入包含Unicode字符的实例,而不接受包含二进制数据的bytes实例。

解决方法:

使用二进制写入模式(‘wb’)来开启待操作文件,而不能像原来那样,采用字符写入模式(‘w’)。文件读取数据的时候也有类似的问题。解决这种问题的办法也相似:用'rb'模式(二进制模式)打开文件,而不要使用'r'模式。

同时适配Python3和Python2的方法:

with open('python3/rndom.bin','wb') as f:
    f.write(os.urandom(10))

2.各个文件操作符的含义:

转自:https://blog.youkuaiyun.com/yizhuanlu9607/article/details/78084266

如果以w方式写入:
f = open('./abcd', "w")
f.write('abc\nabcd')
f.close()
文本w方式写入时, 遇到\n自动替换成\r\n,
 
以二进制文本读:
 
>> > f = open('./abcd', 'rb')
>> > print(f.read())
结果:
b'abc\r\nabcd'
 
以文本读:
 
>> > f = open('./abcd', 'r')
>> > print(f.read())
结果:
abc
abcd
 
综上可知, 只文本w方式写入时, 遇到\n自动替换成\r\n,
所以用二进制读取时, 显示\r\n的格式, 自然以文本读时, 会自动换行
如果以wb方式写入:
f = open('./abcd', "wb")
f.write('abc\nabcd'.encode("utf-8"))
f.close()
 
以二进制文本读:
f = open('./abcd', "rb")
print(f.read())
 
结果: 'abc\nabcd'
 
以文本读:
f = open('./abcd', "r")
print(f.read())
 
结果(换行): 
abc
abcd
 
因为这种情况是二进制方式写入的, 所以只写入了一个\n, 而只有一个\n在windows中
并不会被识别为换行符,

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值