Python3.9修改XML文件遇编码及参数错误,求解决方法
修复Python 3.9修改XML时的编码错误与参数问题
错误原因分析
- UnicodeDecodeError:你的XML文件并非UTF-8编码(比如可能是GBK、UTF-8带BOM或其他编码),直接按UTF-8读取导致解码失败。
- TypeError(encoding参数无效):Python 3.9的
fileinput.FileInput类尚未支持encoding参数,该参数是Python 3.10才新增的,所以传入后会报错。
另外你的代码存在一个潜在问题:os.walk遍历子目录时仅收集了文件名而非完整路径,会导致子目录中的XML文件无法被正确找到和处理。
解决方案
方案1:改用原生open函数处理(推荐,更灵活)
直接用open指定编码读取文件,手动处理备份和内容替换,避开fileinput的版本限制:
import os # 收集所有XML文件的完整路径 FILENAME = [] for root, dirs, files in os.walk('.', topdown=False): for filename in files: if filename.endswith('.xml'): full_path = os.path.join(root, filename) FILENAME.append(full_path) print(full_path) codeskin = input('Enter Code:') Prefab = 'prefab_skill_effects/hero_skill_effects/' Word = Prefab + codeskin CarNew = input('Enter the Character To Replace:') CarNews = Prefab + CarNew # 此处codeskinmod与Prefab内容一致,直接复用即可 # 批量处理每个XML文件 for file_path in FILENAME: # 1. 读取文件内容(先尝试GBK,若仍报错可替换为utf-8-sig、gb2312等编码) with open(file_path, 'r', encoding='gbk') as f: content = f.read() # 2. 执行文本替换 new_content = content.replace(Word, CarNews) # 3. 备份原文件 backup_path = f"{file_path}.bak" os.replace(file_path, backup_path) # 4. 写入修改后的内容 with open(file_path, 'w', encoding='gbk') as f: f.write(new_content) print("所有文件处理完成")
方案2:在Python 3.9中使用fileinput并指定编码
通过fileinput.input()的openhook参数自定义编码读取逻辑,绕过版本限制:
import fileinput import os # 收集所有XML文件的完整路径 FILENAME = [] for root, dirs, files in os.walk('.', topdown=False): for filename in files: if filename.endswith('.xml'): full_path = os.path.join(root, filename) FILENAME.append(full_path) print(full_path) codeskin = input('Enter Code:') Prefab = 'prefab_skill_effects/hero_skill_effects/' Word = Prefab + codeskin CarNew = input('Enter the Character To Replace:') CarNews = Prefab + CarNew # 自定义open钩子,指定文件编码 def open_encoded(filename, mode): return open(filename, mode, encoding='gbk') # 根据实际文件编码调整 # 使用fileinput批量处理文件 with fileinput.FileInput(FILENAME, inplace=True, backup='.bak', openhook=open_encoded) as file: for line in file: print(line.replace(Word, CarNews), end='') print("所有文件处理完成")
关键注意事项
- 确定文件实际编码:可以用Notepad++等文本编辑器打开XML文件,查看右下角的编码标识,再对应修改代码中的编码参数。
- 优先备份文件:代码已包含备份逻辑,处理前确保重要文件有备份,避免数据丢失。
内容的提问来源于stack exchange,提问作者Khánh Đàm
相关产品推荐
相关产品推荐

