跨操作系统的Python open()unicode文件名行为不同

时间:2012-02-29 13:39:23

标签: python unicode

文件名如下:

filename = u"/direc/tories/español.jpg"

使用open()as:

fp = open(filename, "rb")

这将在OSX(10.7)上正确打开文件,但在Ubuntu 11.04上,open()函数将尝试打开u"espa\xf1ol.jpg",这将导致IOError失败。

通过尝试修复此问题的过程我已在两个系统上检查sys.getfilesystemencoding(),两者都设置为utf-8(尽管Ubuntu报告大写,即UTF-8,不确定是否相关)。我还在python文件中设置了# -*- coding: utf-8 -*-,但我确信这只会影响文件本身的编码,而不影响任何外部函数或python如何处理系统资源。该文件存在于两个系统上,并且eñe正确显示。

最后的问题是:如何在Ubuntu系统上打开español.jpg文件?

编辑: español.jpg字符串实际上是通过Django的ORM(ImageFileField)从数据库中出来的,但是当我处理它并看到行为上的差异时,我有一个unicode字符串,它是一个绝对路径文件。

2 个答案:

答案 0 :(得分:2)

下面这个应该适用于两种情况:

fp = open(filename.encode(sys.getfilesystemencoding()), "rb")

答案 1 :(得分:1)

仅仅将文件编码设置在文件顶部是不够的。确保您的编辑器使用相同的编码,并将文本保存在该编码中。如有必要,请重新键入任何非ascii字符,以确保您的编辑正在做正确的事情。

如果您的价值来自例如在数据库中,您仍然需要确保沿着该行的任何地方都不会被编码为非unicode。