繁体   English   中英

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

[英]Python unicode file name with strange characters

我在 Python2.7 中遇到 unicode 问题。 问题是我从数据库中获取了一些数据并将其存储在一个名为 country 的变量中,其值为 u"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)

我不知道为什么会这样。 有人可以帮助我吗? 提前致谢!

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

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

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

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

POSIX 命令行和文件系统是本机基于字节的环境,Unicode 字符串在那里不可用。 非 ASCII 字符使用某种编码编码到文件名和命令中,这可能因系统而异(尽管在现代 Linux 上通常是 UTF-8)。

sys.getfilesystemencoding()将根据希望在环境中定义的变量,为您提供 Python 对本地文件系统上使用的编码的最佳猜测(如果您挂载其他文件系统,则所有赌注都关闭)。

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

您可以使用subprocess.call(['touch', filename.encode(sys.getfilesystemencoding())])来处理必要的参数转义,但通常您应该避免为诸如touch任何东西启动外部命令你可以直接从 Python 做。

例如:

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

(当您open Unicode 文件名时,Python 会将名称编码为默认的文件系统编码。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM