如何在python中使用unidecode(3.3)

如何在python中使用unidecode(3.3),python,unicode,encoding,Python,Unicode,Encoding,我正在尝试从文本文档中删除所有非ascii字符。我找到了一个可以这样做的包裹 它应该接受一个字符串,并将所有非ascii字符转换为最接近的可用ascii字符。我在perl中很容易地使用了这个模块,只需调用while(){$\=unidecode($\;},而这个模块是perl模块的一个直接端口,文档表明它应该工作相同 我相信这很简单,我只是对字符和文件编码理解不够,不知道问题出在哪里。我的原始文件以UTF-8编码(从UCS-2LE转换)。问题可能更多地与我缺乏编码知识和处理字符串错误有关,而不是

我正在尝试从文本文档中删除所有非ascii字符。我找到了一个可以这样做的包裹

它应该接受一个字符串,并将所有非ascii字符转换为最接近的可用ascii字符。我在perl中很容易地使用了这个模块,只需调用
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:the
b'\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。