无法删除有趣的字符"½&引用;在Python 3.9.2中

无法删除有趣的字符"½&引用;在Python 3.9.2中,python,str-replace,Python,Str Replace,#下面是删除Python版本2.6.6中有趣的字符“½”的步骤,它运行良好 #-*- coding: utf-8 -*- import os,glob funny=glob.glob('C:\A\Text\*') #This folder has 10 files, so i use '*' for a loop for h in funny: with open(r'%s' %h, 'r') as infile,open(r'%sN' %h, 'w') as outfile

#下面是删除Python版本2.6.6中有趣的字符“½”的步骤,它运行良好

#-*- coding: utf-8 -*- 

import os,glob

funny=glob.glob('C:\A\Text\*')   #This folder has 10 files, so i use '*' for a loop

for h in funny:
    with open(r'%s' %h, 'r') as infile,open(r'%sN' %h, 'w') as outfile:
        data = infile.read()
        data = data.replace ("13½","13")
        data = data.decode("ascii", "ignore")
        outfile.write(data)
        infile.close()
        outfile.close()
        os.remove(h)
        os.rename(r'%sN' %h,r'%s' %h)
但现在我们升级到3.9.2版,这无法工作,它显示以下错误消息:

回溯(最近一次呼叫最后一次): 文件“C:/A/test.py”,第10行,在 data=infle.read() 文件“C:\Program Files\Python39\lib\encodings\cp1252.py”,第23行,解码 返回编解码器.charmap\u解码(输入、自身错误、解码表)[0] UnicodeDecodeError:“charmap”编解码器无法解码位置10871:字符映射到的字节0x9d


我搜索了很多,在新版本中没有用“½”替换函数,有什么想法吗?

Python 3需要知道输入文件的编码是什么。根据回溯,它似乎默认为cp1252,但显然这是不正确的。我找不到这个字符实际映射到你问题中的字形的编码;有关Python 3.6.8支持的编码列表,请参见(公开:我自己的资源)。(在3.9中不应该有太大变化。)

想要丢弃您不知道如何处理的数据通常只是一种绝望的解决方法,正确的解决方案是了解数据代表的内容,如果错误确实存在,则在源位置修复错误,或者正确处理它而不是删除它

但这里有一个修复你的代码

glob.glob(r'C:\A\Text\*')中的h的
:
目的地=“%sN”%h
以open(h,'r',encoding='latin-1')作为填充,open(dest,'w',encoding='latin-1')作为输出文件:
对于填充中的线:
行=行。替换(“13\x9d”,“13”)
输出文件。写入(行)
移除操作系统(h)
操作系统重命名(目标,h)
这里的拉丁-1编码可能并不完全正确,但只要您在读写时使用相同的编码,并且所有字符代码都是在该编码中定义的(因为它们方便地使用拉丁-1),结果应该是您所期望的


我还进行了重构,一次读取一行,而不是将整个文件存储在内存中;如果您有足够的RAM,这应该无关紧要,但如果您可能有大文件,这也应该提高健壮性。如果文件不是真正的文本文件,可能会回滚更改(但接下来可能会遇到不同的问题)。

FYI,
r'%s'%h
是一种令人困惑的方式,只写
h
。看起来好像是
infle.read()
导致了错误open采用可选的
encoding
关键字。尝试设置
encoding=“utf-8”
,看看会发生什么。@Kevin\x9d在utf-8中也没有很好的定义。