本文目录导读:

我来详细介绍Python中常见的文本编码转换方法:
基本编码转换操作
字符串与字节串转换
# 字符串转字节串(编码)
text = "你好,世界!"
utf8_bytes = text.encode('utf-8')
gbk_bytes = text.encode('gbk')
print(f"UTF-8字节: {utf8_bytes}")
print(f"GBK字节: {gbk_bytes}")
# 字节串转字符串(解码)
utf8_decoded = utf8_bytes.decode('utf-8')
gbk_decoded = gbk_bytes.decode('gbk')
print(f"UTF-8解码: {utf8_decoded}")
print(f"GBK解码: {gbk_decoded}")
常见编码转换场景
GBK与UTF-8互转
# GBK转UTF-8
def gbk_to_utf8(gbk_text):
"""将GBK编码的字符串转为UTF-8"""
# 先解码为Unicode,再编码为UTF-8
if isinstance(gbk_text, bytes):
return gbk_text.decode('gbk').encode('utf-8')
else:
return gbk_text.encode('gbk').decode('gbk').encode('utf-8')
# UTF-8转GBK
def utf8_to_gbk(utf8_text):
"""将UTF-8编码的字符串转为GBK"""
if isinstance(utf8_text, bytes):
return utf8_text.decode('utf-8').encode('gbk')
else:
return utf8_text.encode('utf-8').decode('utf-8').encode('gbk')
# 示例
text = "编码转换测试"
gbk_bytes = text.encode('gbk')
utf8_bytes = text.encode('utf-8')
print(f"原始文本: {text}")
print(f"GBK转UTF-8: {gbk_to_utf8(gbk_bytes)}")
print(f"UTF-8转GBK: {utf8_to_gbk(utf8_bytes)}")
处理编码错误
# 忽略错误
def safe_decode(text_bytes, encoding='utf-8'):
"""安全解码,忽略无法解码的字符"""
try:
return text_bytes.decode(encoding)
except UnicodeDecodeError:
return text_bytes.decode(encoding, errors='ignore')
# 替换错误字符
def safe_decode_replace(text_bytes, encoding='utf-8'):
"""安全解码,替换无法解码的字符"""
return text_bytes.decode(encoding, errors='replace')
# 示例
byte_data = b'\xff\xfe\x41\x00\x42\x00' # 非标准UTF-8数据
print(f"忽略错误: {safe_decode(byte_data)}")
print(f"替换错误: {safe_decode_replace(byte_data)}")
文件编码转换
读取和写入不同编码的文件
def convert_file_encoding(input_file, output_file,
input_encoding='gbk', output_encoding='utf-8'):
"""转换文件编码"""
try:
# 以输入编码读取文件
with open(input_file, 'r', encoding=input_encoding) as f:
content = f.read()
# 以输出编码写入文件
with open(output_file, 'w', encoding=output_encoding) as f:
f.write(content)
print(f"文件编码转换成功: {input_encoding} -> {output_encoding}")
except Exception as e:
print(f"转换失败: {e}")
# 使用示例
# convert_file_encoding('input.txt', 'output.txt', 'gbk', 'utf-8')
批量处理多个文件
import os
def batch_convert_encoding(directory, input_encoding='gbk',
output_encoding='utf-8', file_extensions=['.txt']):
"""批量转换目录下所有文件的编码"""
for filename in os.listdir(directory):
if any(filename.endswith(ext) for ext in file_extensions):
filepath = os.path.join(directory, filename)
try:
with open(filepath, 'r', encoding=input_encoding) as f:
content = f.read()
with open(filepath, 'w', encoding=output_encoding) as f:
f.write(content)
print(f"已转换: {filename}")
except Exception as e:
print(f"转换失败 {filename}: {e}")
自动检测编码
import chardet
def detect_and_convert(text_bytes, target_encoding='utf-8'):
"""自动检测编码并转换为目标编码"""
# 检测原始编码
result = chardet.detect(text_bytes)
source_encoding = result['encoding']
confidence = result['confidence']
print(f"检测到编码: {source_encoding} (置信度: {confidence:.2%})")
try:
# 解码并重新编码
text = text_bytes.decode(source_encoding)
return text.encode(target_encoding)
except (UnicodeDecodeError, UnicodeEncodeError) as e:
print(f"转换失败: {e}")
return None
# 示例
unknown_encoded = b'\xc4\xe3\xba\xc3' # GBK编码的"你好"
converted = detect_and_convert(unknown_encoded, 'utf-8')
if converted:
print(f"原始字节: {unknown_encoded}")
print(f"转换后: {converted.decode('utf-8')}")
实际应用案例
处理网页编码
import requests
def fetch_and_convert_url(url, target_encoding='utf-8'):
"""获取网页内容并转换编码"""
response = requests.get(url)
# 检测响应编码
content_encoding = response.encoding
print(f"原始编码: {content_encoding}")
# 转换为目标编码
content = response.content
if content_encoding.lower() != target_encoding.lower():
content = content.decode(content_encoding).encode(target_encoding)
return content
# 示例
# result = fetch_and_convert_url('https://example.com/gbk-page')
# print(result.decode('utf-8'))
CSV文件编码转换
import csv
def convert_csv_encoding(input_file, output_file,
input_encoding='gbk', output_encoding='utf-8'):
"""转换CSV文件编码"""
with open(input_file, 'r', encoding=input_encoding) as fin:
reader = csv.reader(fin)
rows = list(reader)
with open(output_file, 'w', encoding=output_encoding, newline='') as fout:
writer = csv.writer(fout)
writer.writerows(rows)
print(f"CSV文件编码转换完成: {len(rows)}行")
# 使用示例
# convert_csv_encoding('input.csv', 'output.csv', 'gbk', 'utf-8')
实用的编码转换函数
def universal_converter(text, target_encoding='utf-8'):
"""通用编码转换函数"""
if isinstance(text, bytes):
# 如果是字节串,尝试常见编码
encodings = ['utf-8', 'gbk', 'gb2312', 'big5', 'ascii']
for enc in encodings:
try:
decoded = text.decode(enc)
return decoded.encode(target_encoding)
except UnicodeDecodeError:
continue
raise ValueError("无法识别的编码")
elif isinstance(text, str):
# 如果是字符串,直接编码
return text.encode(target_encoding)
else:
raise TypeError("不支持的输入类型")
# 测试
bytes_data = b'\xc4\xe3\xba\xc3' # GBK编码
result = universal_converter(bytes_data, 'utf-8')
print(f"转换结果: {result.decode('utf-8')}")
注意事项
- 处理错误: 始终使用try-except捕获编码异常
- 指定编码: 读写文件时明确指定编码
- 备份数据: 批量转换前先备份原始文件
- 测试验证: 转换后验证文本是否完整正确
这些案例涵盖了Python中进行编码转换的常见场景,可以根据实际需求选择合适的方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播