如何在python中使用unidecode(3.3)
我正在尝试从文本文档中删除所有非ascii字符。我找到了一个可以这样做的包裹 它应该接受一个字符串,并将所有非ascii字符转换为最接近的可用ascii字符。我在perl中很容易地使用了这个模块,只需调用如何在python中使用unidecode(3.3),python,unicode,encoding,Python,Unicode,Encoding,我正在尝试从文本文档中删除所有非ascii字符。我找到了一个可以这样做的包裹 它应该接受一个字符串,并将所有非ascii字符转换为最接近的可用ascii字符。我在perl中很容易地使用了这个模块,只需调用while(){$\=unidecode($\;},而这个模块是perl模块的一个直接端口,文档表明它应该工作相同 我相信这很简单,我只是对字符和文件编码理解不够,不知道问题出在哪里。我的原始文件以UTF-8编码(从UCS-2LE转换)。问题可能更多地与我缺乏编码知识和处理字符串错误有关,而不是
while(){$\=unidecode($\;}
,而这个模块是perl模块的一个直接端口,文档表明它应该工作相同
我相信这很简单,我只是对字符和文件编码理解不够,不知道问题出在哪里。我的原始文件以UTF-8编码(从UCS-2LE转换)。问题可能更多地与我缺乏编码知识和处理字符串错误有关,而不是与模块有关,希望有人能解释原因。我已经尝试了我所知道的一切,没有随机插入代码,也没有搜索到我目前为止运气不佳的错误
这是我的蟒蛇
from unidecode import unidecode
def toascii():
origfile = open(r'C:\log.convert', 'rb')
convertfile = open(r'C:\log.toascii', 'wb')
for line in origfile:
line = unidecode(line)
convertfile.write(line)
origfile.close()
convertfile.close()
toascii();
如果我没有以字节模式打开原始文件(origfile=open('file.txt','r'
),那么我会得到一个错误UnicodeDecodeError:“charmap”编解码器无法解码1563位置的字节0x90:字符映射到源文件中的行中的
如果我在字节模式下打开它,我会从行=unidecode(行)
行中得到TypeError:ord()预期的字符串长度为1,但找到int
如果我将行声明为字符串line=unidecode(str(line))
,那么它将写入文件,但…不正确。\r\n'b'\xef\xbb\xbf[2013.10.05 16:18:01]User\u Name>\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\
它将写出\n\r等和unicode字符,而不是将它们转换为任何字符
如果我如上所述将行转换为字符串,并以字节模式打开convertfile'wb'
,则会出现错误TypeError:'str'不支持缓冲区接口
如果我在字节模式下打开它而没有声明它是一个字符串'wb'
和unidecode(line)
,那么我会得到TypeError:ord()预期字符串长度为1,但int再次发现
错误。unidecode
模块接受unicode字符串值并返回Python 3中的unicode字符串。您将为其提供二进制数据。请解码为unicode或以textmode打开输入文本文件,并在将结果写入文件之前将其编码为ASCII,或打开输出文本模式下的文本文件
从模块文档中引用:
该模块导出一个函数,该函数接受Unicode对象(Python2.x)或字符串(Python3.x),并返回字符串(,可以在Python3.x中编码为ASCII字节)
我的
这应该起作用:
def toascii():
with open(r'C:\log.convert', 'r', encoding='utf8') as origfile, open(r'C:\log.toascii', 'w', encoding='ascii') as convertfile:
for line in origfile:
line = unidecode(line)
convertfile.write(line)
这将以文本方式打开输入文件(使用UTF8编码,根据采样行判断是正确的),并以文本方式写入(编码为ASCII)
您确实需要明确指定要打开的文件的编码;如果省略编码,则使用当前系统区域设置(调用locale.getpreferredencoding(False)
的结果),如果您的代码需要可移植,它通常不是正确的编解码器。@beanbagging:theb'\xef\xbb\xbf'
您看到的是字节值的表示;这意味着您正在传递str(bytevalue)的结果
,而不是从输入文件解码的unicode字符串值。@BeanBagKing:您使用什么编解码器来解码该文件?在我给出的示例代码中,只有读取该文件才能引发unicode解码异常,但'charmap'编解码器
表明您在这里没有使用UTF-8来解码我认为是UTF-8数据。@BeanBagKing:n您在之前的评论中发布的异常来自何处?顺便说一句,没有理由对文件进行重新编码,无论如何都不适用于Python。@BeanBagKing:注意,我从来没有说过该文件不在UTF-8中,只是您在评论中发布的异常与解码为UTF-8的UTF-8数据的解码错误不一致。取而代之的是,看起来您正试图将UTF-8数据解码为其他编解码器。对于任何想了解并阅读此内容的人来说,对话在讨论中继续进行,根本问题是python 3在默认情况下不以utf8打开文件。原始文件必须以utf8编码显式打开,而转换后的文件必须以utf8编码打开ascii编码中的e。谢谢Martijn。