有人对这个有经验么?

在过去的半年中,我一直在使用python 3.2,而我对2.6.2的记忆却不是那么好。

在我的计算机上,以下代码可以正常运行,并使用2.6.1进行了测试:

import contextlib
import codecs

def readfile(path):
    with contextlib.closing( codecs.open( path, 'r', 'utf-8' )) as f:
        for line in f:
            yield line

path = '/path/to/norsk/verbs.txt'

for i in readfile(path):
    print i


但是在电话上,它会到达第一个特殊字符ø并抛出:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 3: ordinal not in range(128)

我需要输入任何想法以及从文件中读取任何想法吗?

最佳答案

打印是一种I / O操作。 I / O需要字节。 i中的内容是unicode或字符。在谈论ascii时,字符仅直接转换为字节,但是在您的电话上,您遇到的是非ascii字符(u'\xf8' is ø)。要将字符转换为字节,需要对其进行编码。

import contextlib
import codecs

def readfile(path):
    with contextlib.closing( codecs.open( path, 'r', 'utf-8' )) as f:
        for line in f:
            yield line

path = '/path/to/norsk/verbs.txt'

for i in readfile(path):
    print i.encode('utf8')




至于为什么这可以在您的代码上在一台机器上而不是另一台机器上工作,我敢打赌python的自动检测发现了在这些情况下的不同之处。在每个设备上运行此命令:

$ python
>>> import sys
>>> sys.getfilesystemencoding()
'UTF-8'


我希望您会在一个上看到utf8,在另一个上看到ascii。这是目的地为终端时打印所使用的内容。如果您确定python安装的所有用户(很可能只是您)都喜欢utf8而不是ascii,则可以更改python安装的默认编码。


找到您的site.py:python -c 'import site; print site
打开它,找到setencoding函数:

def setencoding():
    """Set the string encoding used by the Unicode implementation.  The
    default is 'ascii', but if you're willing to experiment, you can
    change this."""
    encoding = "ascii" # Default value set by _PyUnicode_Init()

encoding = "ascii"行更改为encoding = "UTF-8"


享受工作中的乐趣。您可以在以下位置找到有关此主题的更多信息:http://blog.ianbicking.org/illusive-setdefaultencoding.html

如果您想将字节与字符(例如python3提供的字符)严格分开,则可以设置encoding = "undefined"undefined编解码器将“ Raise an exception for all conversions. Can be used as the system encoding if no automatic coercion between byte and Unicode strings is desired.

07-24 09:47
查看更多