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

在使用Python3对接百度AI OCR接口时,遇到base64编码异常。问题源于`open()`函数默认以系统编码读取文件,导致非utf-8文件或编码转换错误。解决方案是通过字符流方式读取文件。本文还回顾了`open()`函数的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
  • 在对接百度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 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值