【问题标题】:can not delete the funny character "½" in Python 3.9.2Python 3.9.2 无法删除搞笑字符“½”
【发布时间】:2021-06-22 07:50:43
【问题描述】:

#below是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 版本,这不能工作,它显示如下错误消息:

Traceback(最近一次调用最后一次): 文件“C:/A/test.py”,第 10 行,在 数据 = infile.read() 解码中的文件“C:\Program Files\Python39\lib\encodings\cp1252.py”,第 23 行 返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError:“charmap”编解码器无法解码位置 10871 中的字节 0x9d:字符映射到

我搜索了很多,新版​​本中没有替换功能用那个“½”,有什么想法吗?

【问题讨论】:

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

标签: python str-replace


【解决方案1】:

Python 3 需要知道输入文件的编码。根据回溯,它似乎默认为 cp1252,但显然这是不正确的。我找不到该字符实际映射到您问题中的字形的编码;有关 Python 3.6.8 支持的编码列表,请参阅 https://tripleee.github.io/8bit/#9d(披露:我自己的资源)。 (在 3.9 中应该不会有太大变化。)

希望丢弃您不知道如何处理的数据通常只是一种绝望的解决方法,其中正确的解决方案是了解数据代表什么,如果确实是错误的,则从源头修复错误,否则正确处理而不是删除它。

但是这里有一个修复你的代码的方法。

for h in glob.glob(r'C:\A\Text\*'):
    dest = '%sN' % h
    with open(h, 'r', encoding='latin-1') as infile, open(dest, 'w', encoding='latin-1') as outfile:
        for line in infile:
            line = line.replace("13\x9d", "13")
            outfile.write(line)
    os.remove(h)
    os.rename(dest, h)

Latin-1 编码在这里可能并不完全正确,但只要您使用相同的编码进行读写,并且所有字符代码都在该编码中定义(因为它们方便地在 Latin-1 中)结果应该是你所期望的。

我还重构为一次读取一行,而不是将整个文件吞入内存;如果您有足够的 RAM,则无关紧要,但如果您可能有大文件,这也应该会提高鲁棒性。如果文件不是真正的文本文件,则可能回滚该更改(但无论如何您可能会遇到不同的问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2021-08-27
    • 2015-12-23
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多