5.17 å°†å—节写入文本文件¶
问题¶
ä½ æƒ³åœ¨æ–‡æœ¬æ¨¡å¼�打开的文件ä¸å†™å…¥åŽŸå§‹çš„å—节数æ�®ã€‚
解决方案¶
å°†å—节数æ�®ç›´æŽ¥å†™å…¥æ–‡ä»¶çš„缓冲区å�³å�¯ï¼Œä¾‹å¦‚:
>>> import sys
>>> sys.stdout.write(b'Hello\n')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not bytes
>>> sys.stdout.buffer.write(b'Hello\n')
Hello
5
>>>
类似的,能够通过读�文本文件的 buffer 属性�读�二进制数�。
讨论¶
I/O系统以层级结构的形�构建而�。
文本文件是通过在一个拥有缓冲的二进制模å¼�æ–‡ä»¶ä¸Šå¢žåŠ ä¸€ä¸ªUnicodeç¼–ç �/è§£ç �层æ�¥åˆ›å»ºã€‚
buffer 属性指å�‘å¯¹åº”çš„åº•å±‚æ–‡ä»¶ã€‚å¦‚æžœä½ ç›´æŽ¥è®¿é—®å®ƒçš„è¯�就会绕过文本编ç �/è§£ç �层。
本å°�节例å�展示的 sys.stdout å�¯èƒ½çœ‹èµ·æ�¥æœ‰ç‚¹ç‰¹æ®Šã€‚
默认情况下,sys.stdout 总是以文本模�打开的。
ä½†æ˜¯å¦‚æžœä½ åœ¨å†™ä¸€ä¸ªéœ€è¦�打å�°äºŒè¿›åˆ¶æ•°æ�®åˆ°æ ‡å‡†è¾“出的脚本的è¯�ï¼Œä½ å�¯ä»¥ä½¿ç”¨ä¸Šé�¢æ¼”示的技术æ�¥ç»•过文本编ç �层。