代码之家  ›  专栏  ›  技术社区  ›  ilya n.

python 3不在新服务器上读取unicode文件

  •  4
  • ilya n.  · 技术社区  · 15 年前

    我的网页由一个脚本提供服务,该脚本动态导入一系列文件

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

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

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

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

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

        OK: [server command line] python3.0 page.py /index.ru
        OK: http://whitebox.local/index.ru
    

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

          157     try:
          158         with open (filename, 'r') as f:
          159             exec(f.read())
          160     except IOError: pass
          161 
          /usr/local/lib/python3.0/io.py in read(self=, n=-1)
          ...
          UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 627: ordinal not in range(128) 
    

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

    更新: 我发现的默认编码 open() 平台是独立的吗? utf8 在我的笔记本上 ascii 在服务器上。我想知道是否有一个per-program函数可以在python 3中设置它( sys.setdefaultencoding 用于 site 然后从命名空间中删除)。

    3 回复  |  直到 10 年前
        1
  •  15
  •   Alex Martelli    15 年前

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

        2
  •  1
  •   Flexo - Save the data dump sunny moon    13 年前

    使用codecs库,我使用的是python 2.6.6,我不使用通常的open with encoding参数:

    import codecs
    codecs.open('filename','r',encoding='UTF-8')
    
        3
  •  1
  •   Ehsan Sadr    10 年前

    你可以用类似的东西

    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