You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.9修改XML文件遇编码及参数错误,求解决方法

修复Python 3.9修改XML时的编码错误与参数问题

错误原因分析

  1. UnicodeDecodeError:你的XML文件并非UTF-8编码(比如可能是GBK、UTF-8带BOM或其他编码),直接按UTF-8读取导致解码失败。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:10:34