无法在文本中将readed unicode字符替换为其他字符

时间:2017-02-19 11:05:38

标签: python-3.x unicode

我试图在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()

2 个答案:

答案 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'