5.14 忽略文件å��ç¼–ç �¶
问题¶
ä½ æƒ³ä½¿ç”¨åŽŸå§‹æ–‡ä»¶å��执行文件的I/Oæ“�作,也就是说文件å��并没有ç»�过系统默认编ç �去解ç �或编ç �过。
解决方案¶
默认情况下,所有的文件å��éƒ½ä¼šæ ¹æ�® sys.getfilesystemencoding() 返回的文本编ç �æ�¥ç¼–ç �或解ç �。比如:
>>> sys.getfilesystemencoding()
'utf-8'
>>>
å¦‚æžœå› ä¸ºæŸ�ç§�åŽŸå› ä½ æƒ³å¿½ç•¥è¿™ç§�ç¼–ç �,å�¯ä»¥ä½¿ç”¨ä¸€ä¸ªåŽŸå§‹å—节å—符串æ�¥æŒ‡å®šä¸€ä¸ªæ–‡ä»¶å��å�³å�¯ã€‚比如:
>>> # Wrte a file using a unicode filename
>>> with open('jalape\xf1o.txt', 'w') as f:
... f.write('Spicy!')
...
6
>>> # Directory listing (decoded)
>>> import os
>>> os.listdir('.')
['jalapeño.txt']
>>> # Directory listing (raw)
>>> os.listdir(b'.') # Note: byte string
[b'jalapen\xcc\x83o.txt']
>>> # Open file with raw filename
>>> with open(b'jalapen\xcc\x83o.txt') as f:
... print(f.read())
...
Spicy!
>>>
æ£å¦‚ä½ æ‰€è§�,在最å�Žä¸¤ä¸ªæ“�作ä¸ï¼Œå½“ä½ ç»™æ–‡ä»¶ç›¸å…³å‡½æ•°å¦‚ open() å’Œ os.listdir()
ä¼ é€’å—节å—符串时,文件å��的处ç�†æ–¹å¼�会ç¨�有ä¸�å�Œã€‚
讨论¶
通常æ�¥è®²ï¼Œä½ ä¸�需è¦�担心文件å��的编ç �和解ç �,普通的文件å��æ“�作应该就没问题了。 但是,有些æ“�作系统å…�许用户通过å�¶ç„¶æˆ–æ�¶æ„�æ–¹å¼�去创建å��å—ä¸�符å�ˆé»˜è®¤ç¼–ç �的文件。 这些文件å��å�¯èƒ½ä¼šç¥žç§˜åœ°ä¸æ–那些需è¦�处ç�†å¤§é‡�文件的Python程åº�。
读å�–目录并通过原始未解ç �æ–¹å¼�处ç�†æ–‡ä»¶å��å�¯ä»¥æœ‰æ•ˆçš„é�¿å…�è¿™æ ·çš„é—®é¢˜ï¼Œ å°½ç®¡è¿™æ ·ä¼šå¸¦æ�¥ä¸€å®šçš„编程难度。
关于打å�°ä¸�å�¯è§£ç �的文件å��,请å�‚考5.15å°�节。