2011-04-03 56 views
28

我有一個輸出unicode到控制檯的python腳本,我想將它重定向到一個文件。顯然,python中的重定向過程涉及將輸出轉換爲字符串,所以我得到無法解碼unicode字符的錯誤。我可以將控制檯的unicode輸出直接重定向到文件中嗎?

那麼,有什麼辦法可以重定向到以UTF-8編碼的文件嗎?

+1

[在Python中管道標準輸出時設置正確的編碼](http://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python) – techraf 2016-01-10 23:13:52

回答

28

當打印到控制檯時,Python會查看sys.stdout.encoding以確定打印前用於對unicode對象進行編碼的編碼。

將輸出重定向到文件時,sys.stdout.encoding爲無,因此Python2默認爲ascii編碼。 (相反,Python3默認爲utf-8。)這在打印unicode時通常會導致異常。

您可以自行打印之前明確編碼的Unicode避免錯誤:

print (unicode_obj.encode('utf-8')) 

,或者你可以重新定義sys.stdout因此,所有輸出在utf-8編碼:

import sys 
import codecs 
sys.stdout=codecs.getwriter('utf-8')(sys.stdout) 
print(unicode_obj) 
+0

在將它打印到控制檯之前,我嘗試編碼我的字符串。我的文件有b符號和\ x01 ... codepoints ...當它寫入文件時,它沒有被解碼 – Malwaregeek 2016-03-23 05:59:46

3
import codecs 
file_object = codecs.open("filename", "w", "utf-8") 
file_object.write(u"खऔणन") 
file_object.close() 


這應該做的工作。

+0

wah華additional另外修改華wa華......被接受爲必然。 – Alex 2011-04-03 16:22:41

+0

這幾乎沒有任何修改 – 2011-04-04 03:32:56

+0

這是一個基本的修改,因爲它*強制*你寫入文件,防止使用腳本與* shell *重定向。 – MestreLion 2016-03-03 12:36:10

11

設置環境變量PYTHONIOENCODING在將python腳本重定向到文件之前將其設置爲所需的編碼。那麼你將不必修改原始腳本。請務必寫Unicode字符串,否則PYTHONIOENCODING將不起作用。如果您編寫字節字符串,則字節將按原樣發送到終端(或重定向文件)。

+0

運行'PYTHONENCODING = utf8 script.py'完全不適用於我。我在其他地方看到的PYTHONSTDENCODING都沒有。也許我做錯了。 – qwertyboy 2013-11-26 12:33:43

+1

@qwertyboy,你做錯了。這些拼寫都不是我答案中的拼寫。 – 2013-11-26 15:51:48

+0

當然你是對的。對不起,(這是一個很晚的時候),謝謝。但最終我也嘗試了你的拼寫,這裏是我的終端拷貝:'PYTHONIOENCODING = utf-8 ./quote.py> log.txt',它不起作用。文件命令輸出'log.txt:非ISO擴展ASCII文本' – qwertyboy 2013-11-27 11:49:31

4

在Linux下,可以使用tee並將stderr重定向到/ dev/null。

python script.py 2>/dev/null | tee filename.txt 

你也不需要修改你的Python腳本。

相關問題