当前位置: 首页 > 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.lqws.cn/news/506647.html

相关文章:

  • Redis哈希表Rehash全解析:扩容缩容背后的渐进式智慧
  • SpringBoot 自动化部署实战:CI/CD 整合方案与避坑全指南
  • 相较于传统购物,AR 购物在便利性方面体现在哪些维度?​
  • IDC报告AR/VR市场反弹Meta份额超半,谷歌/微美全息精准卡位AR/AI眼镜市场机遇
  • 快速搭建系统原型,UI界面,有哪些高效的AI工具和方法
  • 数智助农 金融兴乡:中和农信双轮驱动农业现代化实践
  • 重医等利用纯生信在iMeta(中科院1区|IF33.2)发表:多组学联合分析西部五省母婴队列数据
  • 【C/C++】C++ 编程规范:101条规则准则与最佳实践
  • (LeetCode 面试经典 150 题 )121. 买卖股票的最佳时机 (遍历)
  • 【Unity】MiniGame编辑器小游戏(四)数独【Sudoku】
  • 战略调整频繁,如何快速重构项目组合
  • Kubernetes生命周期管理:深入理解 Pod 生命周期
  • 【数据结构】_二叉树的遍历与销毁
  • 交易期权先从买方开始
  • 【Linux网络与网络编程】15.DNS与ICMP协议
  • 打包上传到Linux部署并启动
  • 【JS-4.8-type属性】深入理解DOM操作中的type属性及其常见应用
  • Python 猜数字小游戏:Tkinter 实现的互动猜数挑战
  • 国际标准 ISO 8601 详解
  • SpringBoot + MyBatis 事务管理全解析:从 @Transactional 到 JDBC Connection 的旅程
  • NVIDIA GPU架构学习笔记
  • SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!
  • WPF CommunityToolkit.Mvvm 信使 (ObservableRecipient)
  • EasyExcel单元格内换行,合并单元格
  • 记录一下小程序城市索引栏开发经历
  • 鸿蒙开发深入解析:Service Ability(后台任务)全面指南
  • Spring Boot 返回错误文件的正确性分析与优化
  • httpbin.org是什么,有什么作用
  • 验证 TCP 连接在异常情况下的断开机制之进程(客户端)被 kill 掉
  • ABP VNext + BFF(Backend for Frontend)模式:Angular/React 专用聚合层