2015-10-29 26 views
1

我在Python2.7中遇到unicode問題。問題是我從數據庫中獲取一些數據並將其存儲在名爲country的變量中,值爲u「Espa \ xf1a」。帶有奇怪字符的Python unicode文件名

如果我去的外殼和寫:

>>>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) 

我不知道爲什麼會這樣。任何人都可以幫我嗎?提前致謝!

+0

你不能做到這一點.....基本上使用os.system函數接受一個字符串作爲輸入,不包含任何非ASCII字符 –

回答

0

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

+0

非常感謝你! –

0

試試這個:print ("Espa\u00F1a")。那應該打印España

+0

感謝您的答案@amacb。我試過這個'>>> a = u「Espa \ u00F1a」 >>> file =「%s.txt」%a >>>打印文件 España.txt >>> os。系統( 「觸摸%的」 %文件) 回溯(最近通話最後一個): 文件 「」,1號線,在 UnicodeEncodeError: 'ASCII' 編解碼器不能在10位編碼字符U '\ XF1' :序號不在範圍內(128)'如你所見,我仍然得到相同的錯誤 –

+0

對不起,但我不知道如何寫代碼更好:( –

+0

嗯,我認爲系統沒有就像名字中的unicode字符一樣,如果你在mac上,你可以覆蓋它,但我認爲你不能在windows上... – AMACB

1

很可能是你的操作系統是不是允許你創建的文件。使用touch來創建文件,而不是使用python方式。

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

我假設您正在嘗試寫入文件,並且您希望該文件被稱爲'España.txt'。

1
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一個Unicode文件名,Python的編碼名稱爲默認filesystemencoding你)

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