python打开中文文件名_[请教]python的中文文件名处理
該樓層疑似違規(guī)已被系統(tǒng)折疊 隱藏此樓查看此樓
3 樓的可以用 sys.getfilesystemencoding 檢測(cè),但由於文件系統(tǒng)的差異,文件名 100% 無(wú)損轉(zhuǎn)還是不太可,比如很多 *nix 的文件系統(tǒng)支持除 / 和 \0 外的所有字符,而 win 下不可能
4 樓的可以看 log,當(dāng)然最好的情況是設(shè) logger,設(shè)好以后是一勞永逸的,看 request 和所用的 template 之類的,可以使用 django debug toolbar
1, 5 樓是典型的 encoding 問(wèn)題
文件名先撇開(kāi)不說(shuō),就說(shuō)字符編碼,只要理清邏輯,那麼類似的 ascii 無(wú)法 encode 的錯(cuò)誤你就知道怎麼避免
先說(shuō)編碼,ascii 屬於 7bit,就算加上最高位,也只能編碼 256 個(gè)字符,不說(shuō) cjk,就光光所有歐洲語(yǔ)系都不夠用,於是就出現(xiàn)各種編碼方案,特別是 cjk 的,如早期的 gb2312 和 big5
嗯,扯遠(yuǎn)了,先拉回來(lái)
簡(jiǎn)單的說(shuō),目前常見(jiàn)的 cpython2 打包,估計(jì)編譯時(shí)多設(shè)了內(nèi)部使用 ucs2 編碼,部分可能用 ucs4,簡(jiǎn)單的說(shuō)就是 cpython 內(nèi)部處理
嗯,這個(gè)角度還是太遠(yuǎn)
這麼說(shuō)吧,就是當(dāng)你在外部輸入字符串的時(shí)候,如果有非 ascii 字符,那麼是一定帶有特定的編碼方案的,即所謂的 encoding,比如你常用的 linux 下很可能是 utf-8,那麼如果你要轉(zhuǎn)換成其他編碼方案,比如 gtk,需要先 decode,然后再 encode
比如:
在 utf-8 下的終端中的 repl
>>> s = '中文' # <- 這個(gè)是 utf-8 編碼的 str,如果按 python3 說(shuō)法,這個(gè)是 bytestring,純數(shù)據(jù)流
>>> u = s.decode('utf-8') # <- 這時(shí)候解碼了,變成 unicode string,也就是上面提到的內(nèi)部使用 ucs2 或 ucs4 (早版本 python 看解釋器編譯時(shí)的參數(shù),新一點(diǎn)的好像都是 ucs4 了,如果沒(méi)記錯(cuò)的話)
>>> s_gbk = u.encode('gbk') # <- 這時(shí)候,這兩個(gè)中文字用 gtk 編碼方案從新編碼了,如果(當(dāng)作二進(jìn)制數(shù)據(jù)流)直接寫進(jìn)文件,那麼就是用 gbk 編碼的文本文件
只要理清了這個(gè),那麼上面的文件就知道怎麼處理了,因?yàn)橥ǔJ歉拍顩](méi)理清,不知道什麼時(shí)候該用 encode,什麼時(shí)候該用 decode 造成的。
然后是文件名的編碼問(wèn)題了,一開(kāi)頭說(shuō)的可以找出本地文件系統(tǒng)默認(rèn)編碼,但是,各種方案對(duì) unicode 全字符集的支持不一,比如 gb2312 支持的就少,早期 window 用的 cp932(這個(gè)數(shù)字具體記不清楚) 也少,直接轉(zhuǎn) utf-8 通常還會(huì)出現(xiàn)問(wèn)題,必須過(guò)濾掉非法字符,但這樣又可能出現(xiàn)額外的重名,現(xiàn)代的 windows 文件系統(tǒng)名字編碼應(yīng)該沒(méi)問(wèn)題了,但是我太久沒(méi)用過(guò),無(wú)法驗(yàn)證。
這幾天事情很多,目前只能先草草說(shuō)一下,太亂了將就一些
總結(jié)
以上是生活随笔為你收集整理的python打开中文文件名_[请教]python的中文文件名处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dev里timeedit控件如何赋值_抽
- 下一篇: python怎么返回最初_Python