【问题标题】:Python 3 doesn't read unicode file on a new serverPython 3 不读取新服务器上的 unicode 文件
【发布时间】:2009-06-11 21:12:58
【问题描述】:

我的网页由一个动态导入一堆文件的脚本提供服务

try:
    with open (filename, 'r') as f:
        exec(f.read())
except IOError: pass

(实际上,您能推荐一种更好的文件导入方法吗?我敢肯定有。)

有时文件有不同语言的字符串,例如

# contents of language.ru
title = "Название"

这些都保存为 UTF-8 文件。 Python 在命令行中运行脚本或从我的 MacBook 提供页面没有问题:

OK:【服务器命令行】python3.0 page.py /index.ru 好的:http://whitebox.local/index.ru

但是在尝试从我们刚刚移动到的服务器上提供页面时会引发错误:

157 尝试: 158,打开(文件名,'r')为f: 159 执行(f.read()) 160 除了 IOError:通过 161 /usr/local/lib/python3.0/io.py in read(self=, n=-1) ... UnicodeDecodeError:“ascii”编解码器无法解码位置 627 中的字节 0xe1:序数不在范围内(128)

所有文件都是从我的笔记本电脑上复制的,Apache 完美地提供了这些文件。是什么原因?

更新:我发现open() 的默认编码取决于平台,所以在我的笔记本电脑上是utf8,在服务器上是ascii。我想知道在 Python 3 中是否有一个 per-program 函数来设置它(sys.setdefaultencodingsite 模块中使用,然后从命名空间中删除)。

【问题讨论】:

  • import 通常用于导入文件。有什么理由不适合你?
  • 看看sys.getfilesystemencoding。在 Linux 上,您应该确保语言环境变量 LC_CTYPE 具有合理的值,因为它定义了文件名的含义并且也被 Python 使用。 LC_CTYPE 来自同名环境变量或由LC_ALL 推断。运行locale 命令将告诉您当前值。

标签: unicode python-3.x


【解决方案1】:

使用open(filename, 'r', encoding='utf8')。 见Python 3 docs for open

【讨论】:

    【解决方案2】:

    使用编解码器库,我使用的是 python 2.6.6,我不使用通常的 open with encoding 参数:

    import codecs
    codecs.open('filename','r',encoding='UTF-8')
    

    【讨论】:

      【解决方案3】:

      你可以使用类似的东西

      with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
          data = f.read()
      
      # make changes to the string 'data'
      
      with open(fname + '.new', 'w',
                 encoding="ascii", errors="surrogateescape") as f:
          f.write(data)
      

      更多信息请访问python unicode documents

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        相关资源
        最近更新 更多