You need to enable JavaScript to run this app. Python 3.9.2下原Python2.6.6特殊字符½删除脚本运行报错
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.9.2下原Python2.6.6特殊字符½删除脚本运行报错

报错核心原因
  • 报错和replace函数是否支持½特殊字符没有任何关系,本质是Python 2和Python 3的文件读写、字符串编码逻辑差异
  • Python 2.6.6环境下,open读取文件返回的是字节串,代码里写的"13½"也属于字节串,可直接做字节级匹配替换,后续的.decode("ascii", "ignore")是在替换完成后再做编码转换,全程不会提前触发解码错误
  • Python 3.9.2环境下,open读写文件默认使用Windows系统本地编码(即报错提示的cp1252编码),调用infile.read()时就会直接尝试把文件字节解码为Unicode字符串,根本执行不到replace、decode那几行代码,就因为遇到cp1252规则无法解码的字节抛出异常
  • 原代码里的路径写法也有潜在风险:'C:\A\Text\*'中\t会被Python解析为制表符,长期运行很容易出现路径匹配错误
适配Python 3.9.2的可运行代码
# -*- coding: utf-8 -*-
import os
import glob

# 用原始字符串标记路径,避免转义字符干扰
target_files = glob.glob(r'C:\A\Text\*')

for file_path in target_files:
    temp_path = f"{file_path}_tmp"
    # 显式指定编码,配置解码容错规则,避免读取阶段抛错
    with open(file_path, 'r', encoding='utf-8', errors='ignore') as infile, \
         open(temp_path, 'w', encoding='utf-8') as outfile:
        data = infile.read()
        # 替换逻辑和Python2完全一致,无需额外调整
        data = data.replace("13½", "13")
        outfile.write(data)

    # 替换原文件
    os.remove(file_path)
    os.rename(temp_path, file_path)
关键调整说明
  • 给所有open()调用显式指定encoding='utf-8',搭配errors='ignore'参数,遇到无法解码的字节直接跳过,不会在read()阶段触发UnicodeDecodeError
  • 删除原代码中冗余的data.decode("ascii", "ignore"):Python3中read()返回的已经是解码后的字符串,手动调用decode会因为类型不匹配报错
  • 路径前加r前缀标记为原始字符串,彻底避免Windows路径下的转义字符匹配错误
  • 临时文件直接在原路径后追加后缀,避免原文件带扩展名时生成无意义的xxx.txtN这类命名异常的临时文件
  • with上下文管理器会自动处理文件句柄关闭逻辑,不需要手动调用close(),冗余的关闭代码可直接移除

补充:如果实际文件不是UTF-8编码,可把encoding参数换成文件对应的实际编码(比如gbk、cp1252),只要加上errors='ignore'容错规则,就不会出现解码失败的问题,字符串替换逻辑全程不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 00:45:04