Python 处理Unicode字符

Python 处理Unicode字符,python,python-2.7,unicode,character-encoding,Python,Python 2.7,Unicode,Character Encoding,我知道这个问题以前被问过无数次,但我似乎无法找到任何解决办法。我试过使用编解码器模块和io模块。似乎什么都不管用 我从网络上抓取了一些东西,然后将每个项目的详细信息记录到一个文本文件中,但是脚本在第一次遇到Unicode字符时就会中断 普拉尼卡萨纳西翁康复中心,普拉尼卡康复中心 此外,我不确定Unicode字符可能会在何时何地出现,这增加了额外的复杂性,因此我需要一个总体解决方案,我不确定如何处理潜在的非ASCII字符 我不确定是否在生产环境中使用Python3.6.5,因此解决方案必须使用2.

我知道这个问题以前被问过无数次,但我似乎无法找到任何解决办法。我试过使用
编解码器
模块和
io
模块。似乎什么都不管用

我从网络上抓取了一些东西,然后将每个项目的详细信息记录到一个文本文件中,但是脚本在第一次遇到Unicode字符时就会中断

普拉尼卡萨纳西翁康复中心,普拉尼卡康复中心

此外,我不确定Unicode字符可能会在何时何地出现,这增加了额外的复杂性,因此我需要一个总体解决方案,我不确定如何处理潜在的非ASCII字符

我不确定是否在生产环境中使用Python3.6.5,因此解决方案必须使用2.7

我能在这里做什么?我如何处理这个问题?

# -*- coding: utf-8 -*-
...
with open('test.txt', 'w') as f:
f.write(str(len(discoverable_cards)) + '\n\n')
    for cnt in range(0, len(discoverable_cards)):
        t = get_time()
        f.write('[ {} ] {}\n'.format(t, discoverable_cards[cnt]))
        f.write('[ {} ] {}\n'.format(t, cnt + 1))
        f.write('[ {} ] {}\n'.format(t, product_type[cnt].text))
        f.write('[ {} ] {}\n'.format(t, titles[cnt].text))
...

任何帮助都将不胜感激

如果您使用的是python2.7,那么在将字符串传递给
write
之前,您可能希望使用与unicode兼容的字符集(如“utf8”)对所有字符串进行显式编码,您可以使用一种简单的编码方法:

def safe_encode(str_or_unicode):
    # future py3 compatibility: define unicode, if needed:
    try:
       unicode
    except NameError:
       unicode = str
    if isinstance(str_or_unicode, unicode):
        return str_or_unicode.encode("utf8")
    return str_or_unicode
然后您可以这样使用它:

f.write('[ {} ] {}\n'.format(safe_encode(t), safe_encode(discoverable_cards[cnt])))

您使用的是python 2还是python 3?@MatthewStory python 2.7我应该补充一点,如果您在
wb
模式而不是
w
模式下打开文件,您可以将其作为字节字符串写入文件
f.write(字节('[{}]{}\n'.格式(t,可发现的卡[cnt]))
。那样的话,你的编码就不会angry@C.Nivs有趣的是,我以前用的是wb,然后切换到
w
,因为您不能像通常那样附加到
wb
文件中:/u如何附加到使用
wb
创建的文件?@C.Nivs我仍然收到
wb
的错误。:/code>返回stru或unicode.encode('utf8')中为什么没有破折号?为什么不是utf8
utf-8
?也许这就是我做错的地方。您可以看到这两个版本在任何地方都被使用,我刚才假设
utf8
是一个打字错误,它应该以任何一种方式工作。编码失败的最常见原因是在已编码的字符串上调用它。这是Python 2.7中最严重的设计缺陷之一。当您对字符串调用“encode”时,它首先使用
ASCII
字符集对unicode对象进行解码,然后使用传递的编码调用
encode
。这就是为什么
safe_encode
在编码之前检查它是否是unicode对象的原因。Python3通过只定义unicode对象上的编码和字符串上的解码来解决这个问题,因此,如果您尝试编码字符串而不是奇怪的unicode错误,则会得到AttributeError。我想我知道您在说什么。当我之前尝试编码b4字符串时,如果代码是字符串,它将抛出一个错误。这就是你说的对吧?是的。用“utf8”编码已经“utf8”编码的字符串将在python 2中引发错误。。。请注意,如果在python3上运行“safe_encode”,则“safe_encode”定义将中断(python3中不再定义unicode)。您可以这样修复:try:unicode除了name错误:unicode=str顺便说一句,通常很难使代码与py2和py3兼容,也很难使其与unicode正常工作。