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中
并不会被识别为换行符,