5.14 忽略文件名編碼

2018-02-24 15:26 更新

問題

你想使用原始文件名執(zhí)行文件的I/O操作,也就是說文件名并沒有經(jīng)過系統(tǒng)默認(rèn)編碼去解碼或編碼過。

解決方案

默認(rèn)情況下,所有的文件名都會(huì)根據(jù) sys.getfilesystemencoding() 返回的文本編碼來編碼或解碼。比如:

>>> sys.getfilesystemencoding()
'utf-8'
>>>

如果因?yàn)槟撤N原因你想忽略這種編碼,可以使用一個(gè)原始字節(jié)字符串來指定一個(gè)文件名即可。比如:

>>> # 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!
>>>

正如你所見,在最后兩個(gè)操作中,當(dāng)你給文件相關(guān)函數(shù)如 open()os.listdir()傳遞字節(jié)字符串時(shí),文件名的處理方式會(huì)稍有不同。

討論

通常來講,你不需要擔(dān)心文件名的編碼和解碼,普通的文件名操作應(yīng)該就沒問題了。但是,有些操作系統(tǒng)允許用戶通過偶然或惡意方式去創(chuàng)建名字不符合默認(rèn)編碼的文件。這些文件名可能會(huì)神秘地中斷那些需要處理大量文件的Python程序。

讀取目錄并通過原始未解碼方式處理文件名可以有效的避免這樣的問題,盡管這樣會(huì)帶來一定的編程難度。

關(guān)于打印不可解碼的文件名,請(qǐng)參考5.15小節(jié)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)