python3编码base64中出现的一个异常编码问题[1]

问题:

  • 在对接百度AI接口进行OCR文字扫描时,进行base64过程中,发现如下编码异常:
  File "/Users/mac/PycharmSpace/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
  • 代码如下:
def getImgBase64(imgurl):
    f=open(imgurl, 'r')
    data = f.read()
    base64_data = base64.b64encode(data)
    str_base64 = str(base64_data, 'utf-8')
    print(str_base64)

解决办法:

在读取文件的时候,open()函数默认将文件转为系统默认编码的字符,这会到只两方面问题
1. 读取非utf-8文本或其它编码格式的问题抛出上面的异常
2. 在将utf-8字符串转成base64_data无法转换

  • 所以最终的解决办法,就是以字符流的形式进行转换接收,代码如下:
def getImgBase64(imgurl):
    f=open(imgurl, 'rb')
    data = f.read()
    base64_data = base64.b64encode(data)
    str_base64 = str(base64_data, 'utf-8')
    print(str_base64)

附带回顾一下python中open函数

函数语法:open(name[, mode[, buffering]])

  • name:文件uri
  • mode:决定打开文件的方式
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • buffering:如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

猜你喜欢

转载自blog.csdn.net/m0_37113539/article/details/82429576