2013-10-06 18 views
1

我篩選了大量的python/unicode解釋,但我似乎無法理解這一點。Python 3和Unicode - 如何打印換行符(理解此問題的一般問題)

這裏的情況是:

我拉的意見負載過reddit的(使一個機器人),並想主要是它們存儲在MongoDB中,也需要能夠以打印出評論樹手動檢查發生了什麼。

到目前爲止,我已經沒有問題將註釋放入數據庫,但是當我嘗試打印到標準輸出時,CP1252字符集遇到了顯然不支持的字符問題。

正如我所讀到的,在Python 3中一切內部(字符串)存儲爲Unicode,它的輸入和輸出必須是字節,所以這很好 - 我可以將Unicode編碼爲CP1252,並且在幾種情況下我會看到\ x **我不介意的角色 - 我猜他們代表超出範圍的角色?

的問題是我是用\ n(換行)和標籤,因此很容易查看打印出來評論樹(到標準輸出),但顯然,當你編碼的Unicode字符串換行符轉義序列,它避開他們所以他們打印爲文字。

僅供參考這裏是我的編碼聲明:

encoded = post.tree_to_string().encode('cp1252','ignore') 

感謝

編輯:

我要的是

|Parent Comment 

    |Child comment 1 

     |GChild comment 1 

    |Child comment 2 

|Parent Comment 2 

我得到的是

b"\n|Parent comment \n\n |Child comment \n\n etc 
+1

你真的在打印字符串嗎?你只是在python提示符下查看字符串嗎? – oefe

+0

我希望能夠將它們打印到文件/標準輸出中,以便我可以手動查看它們 - 請參閱示例我現在放在主帖 – Alex

回答

2

當打印到控制檯時,Python將自動編碼控制檯編碼中的字符串(美國Windows上的cp437),並引發控制檯編碼不支持的任何字符的異常。例如:

#!python3 
#coding: utf8 
print('Some text\nwith Chinese 美國\ncp1252 ÀÁÂÃ\nand cp437 ░▒▓') 

輸出:

Traceback (most recent call last): 
    File "C:\test.py", line 5, in <module> 
    print('Some text\nwith Chinese \u7f8e\u56fd\ncp1252 \xc0\xc1\xc2\xc3\nand cp437 ░▒▓') 
    File "C:\Python33\lib\encodings\cp437.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 24-25: character maps to <undefined> 

要改變這個默認,你可以改變stdout明確指定編碼,以及如何處理錯誤:

#!python3 
#coding: utf8 
import io,sys 
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=sys.stdout.encoding,errors='replace') 
print('Some text\nwith Chinese 美國\ncp1252 ÀÁÂÃ\nand cp437 ░▒▓') 

輸出(到cp437控制檯):

Some text 
with Chinese ?? 
cp1252 ???? 
and cp437 ░▒▓ 

你也可以做到這一點明確不改變stdout,通過直接寫入其buffer接口:

sys.stdout.buffer.write('Some text\nwith Chinese 美國\ncp1252 ÀÁÂÃ\nand cp437 ░▒▓'.encode('cp437',errors='replace')) 

第三種選擇是開始的Python,這將改變stdout類似TextIOWrapper解決方案之前設置以下環境變量:

PYTHONIOENCODING=cp437:replace 

最後,因爲你提到還寫入文件,最簡單的方法,看看你寫的所有字符是使用UTF-8編碼的文件:

#!python3 
#coding: utf8 
with open('out.txt','w',encoding='utf8') as f: 
    f.write('Some text\nwith Chinese 美國\ncp1252 ÀÁÂÃ\nand cp437 ░▒▓') 
+0

最後一段代碼實際上將它寫入到我想要的格式的文件中,所以謝謝。奇怪的是,我無法將它寫入標準輸出,但我需要更好地理解該主題。在此期間,這將爲我做。 – Alex

0

我不知道我是否正確理解了您的問題,但難道您只是在打印到標準輸出之前刪除換行符和製表符?

print(re.sub('[\t\n]', ' ', post.tree_to_string())) 

你也可以告訴Python刪除所有控制字符,如here所述。

+0

我需要換行格式 - tree_to_string提供了一個很好的評論意見,他們和縮進 - 所以我想stdout離開新行代替'\ n',但它不會解析他們作爲換行 - 我猜他們逃脫了? – Alex

0

這不是需要編碼蜇到字節打印在python3,只是讓你的標準輸出(控制檯)的Unicode的環境...

打印(*的對象,月=」」,結束= '\ n', file = sys.stdout,flush = False)

+0

我聽說這是不好的做法?如果我找不到其他東西,我會試試這個。 – Alex