1

有人对这个有经验么?

最近半年一直在用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)

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

4

2 回答 2

2

打印是一种 I/O 操作。I/O 需要字节。您拥有的i是 unicode 或字符。当我们谈论 ascii 时,字符仅直接转换为字节,但在您的手机上您遇到了非 ascii 字符(u'\xf8' 是 ø)。要将字符转换为字节,您需要对它们进行编码。

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。当目的地是终端时,这就是 print 使用的内容。如果你确定你的 python 安装的所有用户(很可能只有你)更喜欢 utf8 而不是 ascii,你可以更改 python 安装的默认编码。

  1. 找到你的 site.py:python -c 'import site; print site
  2. 打开它,找到 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() 
    
  3. encoding = "ascii"将行更改为encoding = "UTF-8"

享受 Just Work 的乐趣。您可以在此处找到有关此主题的更多信息:http: //blog.ianbicking.org/illusive-setdefaultencoding.html

如果您希望像 python3 提供的那样严格分隔字节与字符,您可以设置encoding = "undefined". 编解码器将undefined为所有转换引发异常。如果不需要字节和 Unicode 字符串之间的自动强制转换,则可以用作系统编码。

于 2012-07-12T16:16:26.527 回答
0

print 函数需要将字符串转换为可打印的形式,因为 unicode 字符串不能自动打印。使用 repr 包装print repr(i)将允许您打印,但您可能希望指定编码。

于 2012-07-12T16:18:08.857 回答