python中编码与解码简记
一、读取文本文件指定编码方式
示例代码如下:
# 读取输入文件内容
with open(input_file_path, 'r', encoding='utf-8') as input_file:
input_data = input_file.read()
在 Python 中,open 函数的 encoding 参数用于指定打开文件时使用的字符编码方式,如果指定的编码方式与文件本身的编码方式不匹配,可能会导致读取错误或乱码问题。
1.1常用的UTF-8编码
文件本身的编码方式取决于操作系统和使用的文本编辑器,可以使用支持显示文件编码的编辑器(如 Notepad++),打开文件查看编码信息。
各操作系统和文本编辑器默认编码如下:
- Windows 10 之前的版本——记事本:默认编码是 ANSI,这通常是指当前系统区域设置的代码页,例如 GBK(简体中文区域设置)或 Windows-1252(英语区域设置)。
- Windows 10及之后的版本——记事本:默认使用UTF-8编码。
- Visual Studio Code、Notepad++编辑器:默认使用 UTF-8 编码,但可以根据用户配置进行更改。
- Linux 和 macOS 系统上:默认的文本文件编码通常是 UTF-8。
在现代操作系统中,UTF-8 已经成为默认和推荐的文本编码标准,使用 encoding=‘utf-8’ 可以最大程度上确保 Python 正确读取文件内容。
如果不指定 encoding 参数,Python 将使用系统默认的编码方式。
例如:
- Windows 系统的默认编码通常是 cp1252 或 gbk。
- Linux 和 macOS 系统的默认编码通常是 utf-8。
UTF-8 是一种常见的字符编码方式,主要特点为:
- 广泛支持:UTF-8 是一种通用的字符编码方式,在多种系统和平台上都得到广泛支持。
- 能够表示多种字符:UTF-8 可以表示几乎所有的 Unicode 字符,包括 ASCII 字符和其他国际字符。
- 兼容性:使用 UTF-8 编码可以确保文件或数据在不同系统和应用程序之间的兼容性。
- 标准化:UTF-8 已经成为事实上的标准,许多软件和协议都默认使用 UTF-8 编码。
1.2获取文本文件的编码方式
如果需要读取多个编码方式不同的文本文件,就需要先检测文件的编码方式再进行读取。检测编码方式可以通过chardet库实现,示例代码如下:
首先下载安装chardet:
pip install chardet
chardet需要读取文件的一部分,通常是前几百个字节,然后对编码方式进行判断,并给出置信度:
import chardet
import os
def get_coding_type(file_path):
"""获取文件的编码方式"""
#设置读取文件的字节数
file_bytes = os.path.getsize(file_path)
read_bytes = 1024
if file_bytes < read_bytes:
read_bytes = file_bytes
# 读取文件的一部分
with open(file_path, 'rb') as file:
raw_data = file.read(read_bytes)
# 检测编码
result = chardet.detect(raw_data)
coding_type = result['encoding']
confidence = result['confidence']
if coding_type == 'GB2312':
coding_type = 'gbk'
return coding_type
上面代码中设置了如果检测到GB2312将GB2312当作gbk返回,这是因为gbk是GB2312 的扩展编码,能够处理更多的字符集,能够避免设置GB2312可能引发的UnicodeDecodeError。
二、字符串与字节格式互转
示例代码如下:
# 将输入字符串编码为字节数据
input_bytes = input_str.encode('utf-8')
# 将字节数据解码为字符串
input_str = input_bytes.decode('utf-8')
.encode(‘utf-8’):这是字符串对象的方法,用于将字符串按照指定的编码方式进行编码。在这里,编码方式是 UTF-8,指定 UTF-8 编码是一种通用的做法。
- 字符串编码为字节数据时,如果包含非 ASCII 字符:可以使用 UTF-8 或GBK编码方式。
- 字符串编码为字节数据时,如果仅包含 ASCII 字符:编码方式可以任选,可以使用 ASCII 编码,也可以使用 UTF-8 或GBK编码,但UTF-8 或GBK编码的结果与ASCII 编码的结果一致。
- 字节数据解码为字符串使用的解码方式要与编码时选择的编码方式一致,但如果编码使用的是ASCII,解码方式可以任选,并不影响结果。
三、Base64编码解码
Base64编码是一种将二进制数据转换为ASCII字符的编码方式,它起源于1960年代的美国军方通信系统,如今已成为网络通信领域的标准编码方法。
Base64编码解码示例代码如下:
import base64
# 要编码的二进制数据
binary_data = b'Hello, World!'
# 进行 Base64 编码
encoded_data = base64.b64encode(binary_data)
# 将编码后的数据转换为字符串
encoded_string = encoded_data.decode('utf-8')
print("Base64 编码结果:", encoded_string)
# 要解码的 Base64 编码字符串
encoded_string = 'SGVsbG8sIFdvcmxkIQ=='
# 解码 Base64 编码字符串
decoded_data = base64.b64decode(encoded_string)
# 将解码后的数据转换为字符串
decoded_string = decoded_data.decode('utf-8')
print("Base64 解码结果:", decoded_string)
3.1Base64 编解码使用的参数类型
- Base64编码,输入必须为字节,输出为字节。
- Base64解码,输入可以为字节,也可以为字符串,即如下两条代码等价:
decoded_data = base64.b64decode(encoded_string)
decoded_data = base64.b64decode(encoded_data)
不过,传入字节对象是更常见和推荐的做法,因为 Base64 编码本质上是处理字节数据的。
- Base64解码,输出为字节。
3.2Base64 编码后的字符串显示
Base64 编码将二进制数据转换为由 64 个字符组成的字符串,每个字符都代表 6 位二进制数据,这些字符是 ASCII 字符集中的可打印字符。
因此要显示编码后的结果而将编码后的字节数据转换为字符串时,既可指定utf-8,也可指定ascii,如下两条代码,两者效果等价:
#指定utf-8
encoded_string = encoded_data.decode('utf-8')
#指定ascii
encoded_string = encoded_data.decode('ascii')
3.3Base64 解码后的字符串显示
当原始数据为二进制数据时,不需要将解码后的字节数据转换为字符串,但如果原始数据为文本数据,那么就需要显示解码后的文本字符串。
在将解码后的二进制数据转换为字符串时,需要根据原始数据是否包含非 ASCII 字符来选择适当的编码方式。
- 原始数据包含非 ASCII 字符,应该使用 UTF-8 编码或其他适当的 Unicode 编码方式进行解码。
- 原始数据仅包含 ASCII 字符,可以使用 ASCII 编码或UTF-8 编码进行解码。
四、Quoted-Printable编码解码
Quoted-printable(引用打印)是一种用于在电子邮件和其他文本协议中编码非ASCII字符的方法。该编码将非ASCII字符转换为可打印字符,以便它们可以在各种系统和协议之间正确传输。
Quoted-printable编码的基本原则是:
- ASCII字符(字节值小于128)保持不变。
- 非ASCII字符(字节值大于或等于128)被转换为等号(=)后跟其十六进制值的表示形式。例如,字母“é”被编码为“=E9”。
- 编码要求每行不能超过 76 个字符,如果编码后的内容超过 76 个字符,会在 76 个字符处插入一个软换行符(等号 =),然后在下一行继续。
Quoted-Printable编码解码示例代码如下:
import quopri
# 原始字符串
string_data = "Hello, World!"
# 将字符串编码为字节
byte_data = string_data.encode('utf-8')
# Quoted-Printable 编码
encoded_data = quopri.encodestring(byte_data)
encoded_string = encoded_data.decode('utf-8')
print("Quoted-Printable 编码结果:", encoded_string)
# Quoted-Printable 解码
decoded_data = quopri.decodestring(encoded_data)
# 将字节数据解码为字符串
decoded_string = decoded_data.decode('utf-8')
print("解码后的字符串:", decoded_string)
4.1Quoted-Printable编解码使用的参数类型
与Base64编解码使用的参数类型完全相同,如下:
- Base64编码,输入必须为字节,输出为字节。
- Base64解码,输入可以为字节,也可以为字符串,输出为字节。
4.2Quoted-Printable编码后的字符串显示
与Base64编码后的字符串显示方法相同,因为编码后的字符也是ASCII 字符集中的可打印字符。
在将编码后的字节数据转换为字符串时,既可指定utf-8,也可指定ascii,代码与3.2中相同。
4.3Quoted-Printable解码后的字符串显示
与Base64解码后的字符串显示方法相同,不再赘述。