2012-02-20 36 views
3

我似乎無法找到Python3中io.StringIO的默認編碼是什麼。與stdio一樣,它的語言環境如何?python3中的io.StringIO編碼

我該如何改變它?

隨着stdio,似乎只是重新打開正確的編碼作品,但沒有重新打開StringIO這樣的事情。

回答

7

io.StringIO作品可以用Python 3也就是說str對象,你只能讀取,並從StringIO實例寫。沒有編碼 - 如果要將StringIO中獲得的字符串編碼到bytes對象中,但必須選擇其中一個,但字符串本身沒有編碼。

(當然,字符串需要在一些編碼在內部表示。根據你的解釋,該編碼或者是UCS-2或UCS-4,但與Python工作時,你看不到這個實現細節。)

+0

引用「沒有編碼」:如果我執行'stdout = io.StringIO()',那麼哪個編碼標準print()會有什麼? – 2012-02-20 21:51:21

+0

@GiovanniFunchal:仍然沒有,因爲你寫的所有字符串仍然是字符串。他們沒有編碼。 – 2012-02-20 21:52:34

+0

因此,如果我在開始時使用'#coding:utf-8',緩衝區中print(「foo」)的編碼將是'utf-8'? – 2012-02-20 21:58:49

2

正如在另一個答案中已經提到的,StringIO將(unicode)字符串保存在內存中,因此沒有編碼。 如果你確實需要一個類似的編碼對象,你可能想看看BytesIO

如果你想設置stdout的編碼:你不能。至少不是直接的,因爲sys.stdout.encoding是隻寫的(通常)由Python自動確定。 (在使用管道時不起作用) 如果要將具有特定編碼的字節字符串寫入標準輸出,那麼您要麼使用正確的編碼(Python 2)編碼您打印的字符串,要麼使用sys.stdout.buffer.write()(Python 3)發送已經將字節串編碼爲標準輸出。

+0

另一個答案已經是有效的,但我不僅想告訴我們沒有這樣的事情,而是「如何解決它」。 – JonnyJD 2013-10-13 12:27:56

+0

謝謝!這是我正在尋找替換'StringIO.StringIO',同時保持'字節'輸出。 – Cas 2017-06-05 21:13:28