如何将 utf-8 花式引号转换为中性引号
How to convert utf-8 fancy quotes to neutral quotes
我正在编写一个 Python 小脚本来解析 word 文档并写入 csv 文件。但是,某些文档有一些我的脚本无法正确处理的 utf-8 字符。
花哨的引用经常出现 (u'\u201c')。有没有一种快速简便(且智能)的方法可以将它们替换为支持 ascii 的中性引号,这样我就可以将 line.encode('ascii')
写入 csv 文件?
我试图找到左边的引号并替换它:
val = line.find(u'\u201c')
if val >= 0: line[val] = '"'
但无济于事:
TypeError: 'unicode' object does not support item assignment
我描述的是好的策略吗?或者我应该只设置 csv 以支持 utf-8(虽然我不确定将读取 CSV 的应用程序是否需要 utf-8)?
谢谢
您不能分配给字符串,因为它们是不可变的,无法更改。
但是,您可以只使用正则表达式库,这可能是最灵活的方法:
import re
newline = re.sub(u'\u201c','"',line)
您可以使用 Unidecode
package 自动将所有 Unicode 字符转换为最接近的纯 ASCII 等效字符。
from unidecode import unidecode
line = unidecode(line)
这将处理双引号的两个方向以及单引号、长破折号和您可能尚未发现的其他内容。
编辑:一条评论指出,如果您的语言不是英语,您可能会发现 ASCII 限制太多。这是对上述代码的改编,它使用白名单来指示不应转换的字符。
>>> from unidecode import unidecode
>>> whitelist = set('µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ')
>>> line = '\u201cRésumé\u201d'
>>> print(line)
“Résumé”
>>> line = ''.join(c if c in whitelist else unidecode(c) for c in line)
>>> print(line)
"Résumé"
我正在编写一个 Python 小脚本来解析 word 文档并写入 csv 文件。但是,某些文档有一些我的脚本无法正确处理的 utf-8 字符。
花哨的引用经常出现 (u'\u201c')。有没有一种快速简便(且智能)的方法可以将它们替换为支持 ascii 的中性引号,这样我就可以将 line.encode('ascii')
写入 csv 文件?
我试图找到左边的引号并替换它:
val = line.find(u'\u201c')
if val >= 0: line[val] = '"'
但无济于事:
TypeError: 'unicode' object does not support item assignment
我描述的是好的策略吗?或者我应该只设置 csv 以支持 utf-8(虽然我不确定将读取 CSV 的应用程序是否需要 utf-8)?
谢谢
您不能分配给字符串,因为它们是不可变的,无法更改。
但是,您可以只使用正则表达式库,这可能是最灵活的方法:
import re
newline = re.sub(u'\u201c','"',line)
您可以使用 Unidecode
package 自动将所有 Unicode 字符转换为最接近的纯 ASCII 等效字符。
from unidecode import unidecode
line = unidecode(line)
这将处理双引号的两个方向以及单引号、长破折号和您可能尚未发现的其他内容。
编辑:一条评论指出,如果您的语言不是英语,您可能会发现 ASCII 限制太多。这是对上述代码的改编,它使用白名单来指示不应转换的字符。
>>> from unidecode import unidecode
>>> whitelist = set('µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ')
>>> line = '\u201cRésumé\u201d'
>>> print(line)
“Résumé”
>>> line = ''.join(c if c in whitelist else unidecode(c) for c in line)
>>> print(line)
"Résumé"