2010-06-22 131 views
3

我一直在使用python腳本來打開一個unicode名稱(主要是日語)的文件,並保存到Windows Vista 64位的隨機生成(非Unicode)文件名中,並且我有問題...它只是不起作用,它可以很好地處理非unicode文件名(即使它具有unicode內容),但是第二次嘗試傳遞unicode文件名時 - 它不起作用。
下面的代碼:Python不能打開日文文件名

try: 
    import sys, os 
    inpath = sys.argv[1] 
    outpath = sys.argv[2] 
    filein = open(inpath, "rb") 
    contents = filein.read() 
    fileSave = open(outpath, "wb") 
    fileSave.write(contents) 
    fileSave.close() 

    testfile = open(outpath + '.test', 'wb') 
    testfile.write(inpath) 
    testfile.close() 

except: 
    errlog = open('G:\\log.txt', 'w') 
    errlog.write(str(sys.exc_info())) 
    errlog.close() 



和錯誤:

(<type 'exceptions.IOError'>, IOError(2, 'No such file or directory'), <traceback object at 0x01092A30>) 

回答

3

你要轉換您inpath爲Unicode,像這樣:

inpath = sys.argv[1] 
inpath = inpath.decode("UTF-8") 
filein = open(inpath, "rb") 

我猜你是在Python 3使用Python 2.6,因爲,所有字符串默認情況下都是unicode,所以這個問題不會發生。

+0

不,還是一樣的錯誤...而且,我正在使用2.6。 – Jon 2010-06-22 02:18:26

+0

是什麼讓你認爲sys.argv [1]是用UTF-8編碼的? – 2010-06-22 02:19:04

+0

@Daniel,沒錯,它可能是用別的東西編碼的,比如shift_jis,euc-jp或iso-2022-jp。 – jcao219 2010-06-22 02:21:38

1

我的猜測是,sys.argv中1和sys.argv中[2]只是字節數組和Don」 t支持本地Unicode。您可以通過打印並確認它們是否是您期望的角色來確認。您還應該打印類型(sys.argv 1)以確保它們的類型正確。

命令行參數從哪裏來?他們是來自另一個程序,還是你在命令行輸入它們?如果他們來自另一個程序,您可以讓其他程序將它們編碼爲UTF-8,然後讓您的Python程序使用UTF-8對它們進行解碼。

您使用的是哪個版本的Python?

編輯:這裏有一個強大的解決方案:http://code.activestate.com/recipes/572200/

+0

其實我做了類似的事情 - 我拿出第一個打開的文件,並用兩個傳入的參數替換內容 - 並且它們傳遞的很好,文件保存了我設置的確切文件名,即使第一個是unicode。 它來自PHP,但這不是一個問題 - 我也嘗試了對文件名進行硬編碼。 – Jon 2010-06-22 02:20:17

+0

@Jon:它保存你設置的確切文件名......但是以什麼編碼?您還應該保存str(鍵入(sys.argv [1]))以查看Python是否認爲sys.argv是str或unicode類型。 – 2010-06-22 02:28:34

+0

我不確定,檢查的最佳方法是什麼?另外,我把str(type(sys.argv [1]))放入錯誤日誌中,它會吐出: Jon 2010-06-22 02:32:44