我试图在Python3中做一个解析器,它取代了不会出现在英文字母表中的特殊西班牙语字符。为此,我有一个包含所有转换的csv文本文件(以utf-8编码):
\ u00c1,\ u0041
\ u00c9,\ u0045
...
\ u00fc,\ u0075
但是当我运行解析器时,它什么也做不了。另一方面,如果我这样做,完美地运作:
text.replace('\u00c1', '\u0041')
以下是代码:
#!/usr/bin/env python3
from csv import reader
class Parser():
def __init__(self, lang):
self.lang = lang
def replace(self, text):
with open('./data/{}/replace.csv'.format(self.lang), 'r') as file:
csvreader = reader(file)
for l in csvreader:
# text = text.replace('\u00f1','\u006e') This works
text = text.replace(l[0],l[1])
return text
def main():
myparser = Parser('spanish')
with open('/home/marco/Escritorio/ejemplo.txt', 'r') as file:
text = file.read()
print(myparser.replace(text))
if __name__ == '__main__':
main()
答案 0 :(得分:1)
以二进制模式打开CSV文件,然后从“转义的unicode”转换每一行,例如{1}},unicode(在Python 3中键入'\\u00c1'
)之前 CSV阅读器可以获取数据:
str
使用def replace(self, text):
with open('./data/{}/replace.csv'.format(self.lang), 'rb') as f:
csvreader = reader(line.decode('unicode_escape') for line in f)
for l in csvreader:
text = text.replace(l[0], l[1])
return text
将来自转义的unicode的传入数据解码为unicode编码。解码将具有内存效率,因为它使用了一个生成器,避免将整个CSV读入内存。完成后,CSV模块将以unicode的形式处理数据,字符串替换应该按预期工作。
答案 1 :(得分:0)
另一种方法是将原始文本字符分解为其非重音字符及其重音符号。接下来编码为ASCII忽略错误,它将删除所有非ASCII重音符号。如果需要,再次对其进行解码以使其恢复为Unicode。
>>> import unicodedata
>>> s ='áéíóúüñ'
>>> unicodedata.normalize('NFD',s)
'a\u0301e\u0301i\u0301o\u0301u\u0301u\u0308n\u0303'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore')
b'aeiouun'
>>> unicodedata.normalize('NFD',s).encode('ascii',errors='ignore').decode('ascii')
'aeiouun'