当前位置: 首页 > news >正文

Python Bug 修复案例分析:编码问题导致程序出现bug 两种修复方法

       

          前期开发了一个简单的文件处理程序,用于批量重命名和压缩图片。但在处理包含中文名称的文件时,程序总是崩溃。让我们一步步分析并修复这个问题。

一、问题描述

用户使用反馈:

"当选择的文件夹中包含中文名称的图片时,程序直接崩溃,错误信息显示 'UnicodeEncodeError: 'ascii' codec can't encode characters in position...'"

二、复现问题

       以下是引发崩溃的原始代码

import os
import zipfiledef compress_images(folder_path, output_zip):with zipfile.ZipFile(output_zip, 'w') as zipf:for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith(('.jpg', '.png')):file_path = os.path.join(root, file)# 问题代码:直接使用原始文件名zipf.write(file_path, file)print(f"压缩完成: {output_zip}")# 使用示例
compress_images("D:/图片/旅行", "旅行照片.zip")

三、调试与分析

  1. 错误信息解析:
    UnicodeEncodeError: 'ascii' codec can't encode characters in position...
    → Python 默认使用 ASCII 编码处理字符串,而中文等非 ASCII 字符无法被正确编码。

  2. 关键排查点:

    • zipf.write(file_path, file) 这一行将文件添加到 ZIP 时,file(中文文件名)无法被 ASCII 编码。
    • Windows 系统默认文件名编码为 GBK,而 Python 脚本默认使用 UTF-8。
  3. 简化测试用例

# 验证编码问题
filename = "中文图片.jpg"
print(filename.encode('ascii'))  # 直接触发 UnicodeEncodeError

四、bug修复方案

方案 1:指定 ZIP 文件编码为 UTF-8
import os
import zipfiledef compress_images(folder_path, output_zip):with zipfile.ZipFile(output_zip, 'w', compression=zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith(('.jpg', '.png')):file_path = os.path.join(root, file)# 获取相对路径,避免包含完整路径arcname = os.path.relpath(file_path, folder_path)# 指定编码为UTF-8zipf.write(file_path, arcname.encode('utf-8').decode('utf-8'))print(f"压缩完成: {output_zip}")
方案 2:使用系统默认编码
import os
import zipfile
import sysdef compress_images(folder_path, output_zip):# 获取系统默认文件系统编码fs_encoding = sys.getfilesystemencoding()with zipfile.ZipFile(output_zip, 'w') as zipf:for root, dirs, files in os.walk(folder_path):for file in files:if file.endswith(('.jpg', '.png')):file_path = os.path.join(root, file)arcname = os.path.relpath(file_path, folder_path)# 使用系统编码处理文件名arcname_encoded = arcname.encode(fs_encoding, errors='replace')arcname_decoded = arcname_encoded.decode('utf-8', errors='replace')zipf.write(file_path, arcname_decoded)

五、bug验证修复

  1. 测试中文文件名:
    创建包含中文名称的图片文件(如 风景.jpg),运行修复后的代码,确认不再崩溃。

  2. 解压验证:
    解压生成的 ZIP 文件,检查文件名是否保持正确(中文未乱码)。

  3. 边缘情况测试:

    • 包含特殊字符的文件名(如 !@#$%^&*.jpg)。
    • 不同系统(Windows/Linux/macOS)下的兼容性。

六.bug修复总结

           这个案例暴露了 Python 在处理多编码文件名时的常见陷阱。核心教训:

编码问题优先排查:文件操作、网络传输中,编码不匹配是常见错误源。

使用相对路径:避免在 ZIP 文件中包含完整路径,减少编码冲突。

测试覆盖边缘情况:确保代码在特殊字符、非 ASCII 字符下正常工作。

通过显式指定编码和使用系统默认编码,成功解决了中文文件名导致的崩溃问题,让程序更加健壮。

              总之,Python Bug 的修复过程是一个不断学习和积累经验的过程。通过深入分析问题、选择合适的修复方法,并总结经验教训,我们能够不断提升自己的编程能力,编写出更加健壮、可靠的 Python 程序 。  

 

http://www.lryc.cn/news/574568.html

相关文章:

  • FSMC控制LCD(TFTLCD:Z350IT002)显示案例
  • CUDA NCU Occupancy学习笔记
  • 触觉智能RK3506核心板/开发板-开源鸿蒙+星闪分享(上)
  • Web Worker 通信封装与实战应用详解
  • .NET Core充血模型
  • go语言 *和
  • 配置自己的NTP 服务器做时间同步
  • HTML炫酷烟花
  • 知乎-AI大模型全栈工程师课程1~12期(已完结)
  • 通义灵码2.5智能体模式实战———集成高德MCP 10分钟生成周边服务地图应用
  • 同城信息发布 app 交流互动系统框架设计
  • WPF 几种绑定 (笔记)
  • maven:迁移到 Maven Central 后 pom.xml的配置步骤
  • pdf转图片(png,jpg)的python脚本
  • 发布 npm 包完整指南(含账号注册、发布撤销与注意事项)
  • 【云计算】云测试
  • 成交量流动策略
  • Unity3D仿星露谷物语开发70之背景音乐
  • 软件测试报告机构如何保障软件质量与安全性?作用有哪些?
  • 使用 PyFluent 自动化 CFD
  • 用 Python 打造立体数据世界:3D 堆叠条形图绘制全解析
  • 【Pandas】pandas DataFrame update
  • 华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例
  • 《C++初阶之类和对象》【初始化列表 + 自定义类型转换 + static成员】
  • 在 centos7部署kubephere
  • TortoiseSVN 安装教程
  • prometheus+grafana+MySQL监控
  • 云原生周刊:Argo CD v3.1 正式发布
  • 工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比
  • Jenkins+Jmeter+Ant接口持续集成