我们看到了在文件打开模式中有以下模式:rb、wb……有这种带 b 的。
什么意思呢?

就是用二进制的方式打开文件。

# 1.只读模式打开文件
f1 = open('d:\\infile.txt')
# 2.写模式打开文件
f2 = open('output.txt', 'w')
# 3.以二进制写模式打开文件
f3 = open('record.dat', 'wb', 0)

open()函数-mode

ModeFunction
r以读模式打开
w以写模式打开(清空原内容)
x以写模式打开,若文件已存在则失败
a以追加模式打开(从EOF开始,必要时创建新文件)
r+以读写模式打开
w+以读写模式打开(清空原内容)
a+以读和追加模式打开
rb以二进制读模式打开
wb以二进制写模式打开(参见w)
ab以二进制追加模式打开(参见a)
rb+以二进制读写模式打开(参见r+)
wb+以二进制读写模式打开(参见w+)
ab+以二进制读写模式打开(参见a+)
ab+以二进制读写模式打开(参见a+)

我们来举个例子。

# 1.读写模式打开文件
f = open('img.png')

# 2. 写入文件内容
for i in f:
    print(i)
print('代码执行结束!')

# 3.关闭文件
f.close()

很明显,我们出现了以下错误:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-14-fa3f29988d83> in <module>()
      3 
      4 # 2. 写入文件内容
----> 5 for i in f:
      6     print(i)
      7 print('代码执行结束!')

UnicodeDecodeError: 'gbk' codec can't decode byte 0xf3 in position 30: illegal multibyte sequence

主要原因是因为编码的问题,可能是因为0x82这个字节在gbk编码中没有这个字符,

可能原字符是两个字节,在gbk里被解析成了一个字节,导致字符不存在。

这就是我们文件打开方式需要使用二进制读取的原因。

# 1.读写模式打开文件
f = open('img.png', 'rb')

# 2. 写入文件内容
for i in f:
    print(i)
print('代码执行结束!')

# 3.关闭文件
f.close()

'''
代码执行结束!
'''

图片

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐