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

Python3.9读取UTF-8文件首行乱码 如何移除开头无效字符

问题原因

你遇到的UTF-8文件开头乱码,绝大多数是UTF-8带签名(BOM)格式的隐藏字符\ufeff导致的,这类字符是Windows平台下多数编辑器存储UTF-8文件时默认添加的标识字符,不属于文本有效内容,会被Python默认的UTF-8解码规则识别为普通字符,最终导致首行第一个字符读取异常。

解决方案

方法1:指定编码为utf-8-sig(推荐)

Python内置的utf-8-sig编码会自动识别并移除文件开头的BOM字符,无需额外编写处理逻辑,仅修改打开文件的代码行即可:

# 仅需在open参数中添加encoding='utf-8-sig'
with open(input("请输入脚本文件名:"),'r', encoding='utf-8-sig') as script_file:

该方案兼容性最优,无论目标文件是否携带BOM都可以正常读取,不会对无BOM的标准UTF-8文件产生任何影响。

方法2:手动过滤开头无效字符(适用于存在BOM外其他杂散无效字符的场景)

如果文件开头除了BOM还有其他无效乱码,可以通过匹配合法首字符的方式手动过滤前缀,修改后的完整代码如下:

actions = {'#': '注释', 'A': '操作', 'T': 'polly播报文本', 'F': '文件名'}
valid_start_chars = actions.keys() # 定义合法行首字符集合
action = "#"
poly_text_received=False
script_line = "none"
line_cnt = 0

with open(input("请输入脚本文件名:"),'r', encoding='utf-8') as script_file:
    for line in script_file:
        line_cnt = line_cnt + 1
        line = line.strip()
        # 新增逻辑:遍历找到第一个合法字符,截断前面的无效内容
        for idx, char in enumerate(line):
            if char in valid_start_chars:
                line = line[idx:]
                break
        # 空行直接跳过,避免后续取line[0]时报索引越界错误
        if not line:
            continue
        action = actions.get(line[0])
        if action == '注释':
            line = line[1:].lstrip(':')
            print(f'忽略注释内容:\n'
                  f'     {line}')
额外注意事项

原代码未做空行判断,如果读取到空行时调用line[0]会直接抛出索引越界异常,建议补充空行跳过逻辑,提升代码稳定性。

内容的提问来源于stack exchange,提问作者Lanette Manzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:57:02