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
相关产品推荐
相关产品推荐

