使用Python编码任意文件类型时文件损坏的相关问题
问题解答
疑问1:是否应使用utf-8文本编码处理所有文件类型?
绝对不行。文件分为文本文件(如.py、.txt)和二进制文件(如.docx、.jpg)两类:
- 文本文件由字符组成,适合用UTF-8这类文本编码读写;
- 二进制文件由原始字节构成(比如图片像素数据、压缩文档的二进制结构),用UTF-8编码读取时,会强行把二进制字节解析成UTF-8字符,这个过程会破坏原始数据,再转成字节写入新文件后,文件必然损坏。
疑问2:有没有适用于所有文件类型的标准文本编码格式?
不存在这样的文本编码。因为二进制文件本质不是文本,根本不应该用文本编码处理。正确的做法是对所有文件统一使用二进制模式读写,直接操作原始字节,这样不管是文本还是二进制文件都能完整复制。
修正后的代码
def read_files(): files = ["program.py", "letter.docx", "cat.jpg", "hello_world.py"] for file in files: # 用二进制模式读取原始字节 with open(file, "rb") as f: file_content = f.read() # 拆分文件名和扩展名(兼容文件名含多个点的情况) file_name, file_extension = file.rsplit(".", 1) # 用二进制模式写入原始字节 with open(f"{file_name}_converted.{file_extension}", "wb") as f: f.write(file_content) read_files()
代码说明
- 使用
with语句自动管理文件句柄,避免手动关闭文件的疏漏; - 用
rb(读二进制)和wb(写二进制)模式,直接读写原始字节,不做任何编码转换,保证文件数据完整; - 用
rsplit(".", 1)拆分文件名和扩展名,能正确处理像test.v2.py这类含多个点的文件名。
内容的提问来源于stack exchange,提问作者logan_9997
相关产品推荐
相关产品推荐

