Ubuntu可用的Python文本替换脚本在Devuan Daedalus遇编码错误
解决Python脚本UnicodeDecodeError及二进制模式编码参数报错问题
方案一:文本模式下兼容非UTF-8文件
你的报错源于脚本默认用UTF-8解码文件,但部分文件包含非UTF-8字符(比如0xad是Windows-1252编码的软连字符)。可通过以下方式修改:
- 指定匹配文件的编码:若明确文件使用Windows-1252这类编码,直接在打开文件时指定:
# 读取文件 with open(file_path, 'r', encoding='windows-1252') as f: content = f.read() # 替换文本 content = content.replace("要替换的旧文本", "新文本") # 写入文件 with open(file_path, 'w', encoding='windows-1252') as f: f.write(content)
- 忽略/替换解码错误:若不确定编码,可让Python跳过或替换无法解码的字符:
# 忽略错误字符(会丢失乱码内容) with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: content = f.read() # 或替换错误字符为� with open(file_path, 'r', encoding='utf-8', errors='replace') as f: content = f.read() # 替换后写入(保持UTF-8编码) content = content.replace("要替换的旧文本", "新文本") with open(file_path, 'w', encoding='utf-8') as f: f.write(content)
方案二:二进制模式处理(绕开编码问题)
二进制模式打开文件不需要encoding参数,你之前报错是因为额外添加了该参数。修改方式是把文本转成字节再执行替换:
# 把要替换的文本转成字节(若文件非UTF-8编码,替换成对应编码即可) old_bytes = "要替换的旧文本".encode('utf-8') new_bytes = "新文本".encode('utf-8') # 二进制读取文件 with open(file_path, 'rb') as f: content = f.read() # 字节层面完成替换 content = content.replace(old_bytes, new_bytes) # 二进制写入文件 with open(file_path, 'wb') as f: f.write(content)
为什么Ubuntu上能正常运行?
Ubuntu Focal默认文件编码为UTF-8,且你朋友系统内的文件均为UTF-8编码;或是他的脚本未指定encoding参数,Ubuntu的默认编码恰好兼容含特殊字符的文件,而Devuan Daedalus的默认编码无法处理这类字符,因此触发报错。
内容的提问来源于stack exchange,提问作者vrgovinda
相关产品推荐
相关产品推荐

