Python unicode文件名,带有奇怪的字符

时间:2015-10-29 11:44:37

标签: python unicode

我在Python2.7中遇到unicode问题。问题是我从数据库获取了一些数据并将其存储在一个名为country的变量中,其值为“Espa \ xf1a”。

如果我转到shell并写下以下内容:

>>>country
>>>u"Espa\xf1a"
>>>print country
>>>España

没关系。没问题。当我尝试按如下方式创建名为España.txt的文件时出现问题:

>>> country = u"Espa\xf1a"
>>> file = "%s.txt" % country
>>> file
u'Espa\xf1a.txt'
>>> print file
España.txt
>>> os.system("touch %s" % file)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 10: ordinal not in range(128)

我不知道为什么会这样。谁能帮助我?提前谢谢!

4 个答案:

答案 0 :(得分:1)

很可能是您的操作系统不允许您创建文件。不要使用touch来创建文件,而是尝试使用python方法。

f = open(file, 'w')
...
f.close()

我假设您正在尝试写入该文件,并且您希望该文件名为“España.txt”。

答案 1 :(得分:1)

os.system("touch %s" % file)

POSIX命令行和文件系统是一个基于字节的本地环境,那里没有Unicode字符串。非ASCII字符使用某种编码编码为文件名和命令,这些编码因系统而异(尽管在现代Linux上它通常是UTF-8)。

sys.getfilesystemencoding()将为您提供Python对本地文件系统中正在使用的编码的最佳猜测(如果您安装其他文件系统,所有投注均已关闭),这些变量可能来自希望在环境中定义的变量。

你永远不应该在命令中调用os.system包含变量。如果变量中存在意外字符,则它们最终会执行任意命令,从而带来灾难性的安全后果。

您可以使用subprocess.call(['touch', filename.encode(sys.getfilesystemencoding())])之类的接口来处理必要的参数转义,但一般情况下,您应该避免为可以直接从Python执行的touch等任何内容启动外部命令。

例如:

open(filename, 'wb').close()

(当您open为Unicode文件名时,Python会根据您的名称对默认文件系统编码进行编码。)

答案 2 :(得分:0)

试试这个:print ("Espa\u00F1a")。那应该打印España

答案 3 :(得分:0)

尝试:     os.system("touch %s" % file.encode('utf-8'))