Python读取unicode替换的csv文件

2024-09-28 01:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要根据一组自定义的替换替换替换unicode。基本上是由其他人定义的替换。现在我已经将所有需要的替换提取到一个csv文件中。下面是一个示例:

\u0020, 
\u0021,!
\u0023,#
\u0024,$
\u0025,%
\u0026,&
\u0028,(
\u0029,)
\u002a,*
\u002b,+
\u002c,","
\u002d,-
\u002e,.
\u002f,/
\u03ba,kappa
...

我在msexcel中生成了这个,它是通过破解API所有者在需要进行转换时自己使用的java程序(不……当API接收到输入时,他们不会仅仅运行转换器)。定义了大约1500个替换。在

当我生成输出(从我的Django应用程序)作为输入发送到它们的API时,我想处理替换。以下是我一直试图做到的:

^{pr2}$

问题是csv文件中的unicode代码显示为,例如,self.mapping[example][0] = '\\u00e0'。好吧,那就错了,让我们试试:

mapping.append( (row[0].decode("string_escape"), row[1]) )

没有变化。怎么样:

mapping.append( (row[0].decode("unicode_escape"), row[1]) )

好了,现在self.mapping[example][0] = u'\xe0'。所以是的,这是我需要替换的字符…但是我需要调用replace_UTF8()函数的字符串看起来像u'\u00e0'。在

我也试过row[0].decode("utf-8")row[0].encode("utf-8")unicode(row[0], "utf-8")。在

我也尝试了this,但是csv文件中没有unicode字符,我有unicode代码点(不确定这是否是正确的术语或什么)。在

那么,如何将从csv文件中读入的字符串转换成可以与mythi一起使用的unicode字符串需要转换的长度。更换(...)? 在

或者…我需要对csv文件做些其他的事情来使用更合理的方法吗?在


Tags: 文件csv字符串代码selfapi定义example
1条回答
网友
1楼 · 发布于 2024-09-28 01:29:25

我不认为你的问题真的存在:

Ok, now self.mapping[example][0] = u'\xe0'. So yeah, that's the character that I need to replace...but the string that I need to call the replace_UTF8() function on looks like u'\u00e0'.

这些只是同一字符串的不同表示。您可以自己测试:

>>> u'\xe0' == u'\u00e0'
True

实际的问题是你没有做任何替换。在本规范中:

^{pr2}$

您只是反复调用string.replace,它返回一个新字符串,但对string本身没有任何作用。(它不能对string本身做任何事情;字符串是不可变的)

def replace_UTF8(self, string):
    for old, new in self.mapping:
        print new
        string = string.replace(old, new)
    return string

但是,如果string真的是一个UTF-8编码的str,正如函数名所暗示的那样,这仍然行不通。当你用UTF-8编码u'\u00e0'时,你得到的是'\xce\xa0'。里面没有要替换的\u00e0。所以,你真正需要做的是解码,替换,然后重新编码。像这样:

def replace_UTF8(self, string):
    u = string.decode('utf-8')
    for old, new in self.mapping:
        print new
        u = u.replace(old, new)
    return u.encode('utf-8')

或者,更好的方法是,在整个程序中保持unicode而不是编码的str,这样你就不必担心这些东西了。在


最后,当字符串(无论是strunicode)都有一个内置的^{}方法来完成您想要的操作时,这是一种非常缓慢和复杂的替换方法。在

与其将表构建为Unicode字符串对的列表,不如将其构建为将序号映射到序号的dict映射:

mapping = {}
for row in reader:
    mapping[ord(row[0].decode("unicode_escape"))] = ord(row[1])

现在,整个过程都是一行代码,即使你的编码一团糟:

def replace_UTF8(self, string):
    return string.decode('utf-8').translate(self.mapping).encode('utf-8')

相关问题 更多 >

    热门问题