問題
你想使用原始文件名執行文件的I/O操作,也就是說文件名并沒有經過系統默認編碼去解碼或編碼過。
解決方案
默認情況下,所有的文件名都會根據 sys.getfilesystemencoding()
返回的文本編碼來編碼或解碼。比如:
1
2
3
|
>>> sys.getfilesystemencoding() 'utf-8' >>> |
如果因為某種原因你想忽略這種編碼,可以使用一個原始字節字符串來指定一個文件名即可。比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
>>> # 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程序。
讀取目錄并通過原始未解碼方式處理文件名可以有效的避免這樣的問題, 盡管這樣會帶來一定的編程難度。
關于打印不可解碼的文件名,請參考
以上就是Python 忽略文件名編碼的方法的詳細內容,更多關于Python 忽略文件名編碼的資料請關注服務器之家其它相關文章!
原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c05/p14_bypassing_filename_encoding.html