开发者问题收集

Python:替换文本文件中的不寻常字符

2021-06-30
826

我尝试在文本文件中自动进行以下更改/替换。

â€\u9d  = "
“ = "
’ = '
— = :

我不断遇到以下错误:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 452: character maps to <undefined>

这是我最近的代码:

fin = open("example.md", "rt")
data = fin.read()
data = data.replace(r'â€\u9d', '\"')
data = data.replace(r'“', '\"')
data = data.replace(r'’', '\"')
data = data.replace(r'—', ':')


fin.close()
fin = open("data.txt", "wt")
fin.write(data)
fin.close()
2个回答

根据此 问题 ,您可以使用 re.sub ,如下所示:

import re
my_str = "hey th~!ere"
my_new_string = re.sub('[^a-zA-Z0-9 \n\.]', '', my_str)
print my_new_string

我测试过了,可以正常工作:)

armin shoughi
2021-06-30

您有两个问题。首先,您使用错误的编码打开文件,导致出现 mojibake 的情况,正如 @JosefZ 在评论中建议的那样。解决方案与他建议的完全一样:

fin = open("example.md", "rt", encoding="utf-8")

第二个问题是,您使用了一种非常笨拙的方式来纠正第一个问题。您可能会发现,一旦您正确读取字符,就无需修复它们。但是如果您仍然需要将花括号转换为直引号,以便所有内容都与 ASCII 兼容,那么使用 unidecode 模块 可以更轻松地完成此操作。

from unidecode import unidecode
data = unidecode(data)

这将处理您问题中列出的所有字符,以及更多其他字符。

Mark Ransom
2021-07-01