作者pkmu8426 (巴426)
看板Python
標題[問題] 有效、不違法的存檔路徑字元?
時間Tue May 23 12:45:05 2017
講的是Windows系統
想排除不可列印字元、16進制
但中文、日文、全形、合法符號都能保留
違法字這邊無法貼 因為ptt也貼不上來...
補個違法字樣本:
http://i.imgur.com/c9SvoRY.jpg
最後面那串箭頭符號 網頁顯示
有試過了一些方法
sys.getfilesystemencoding() # 系統預設編碼
str.maketrans('', '', '\/*?:"<>|') # 排除微軟預設不合法字元
# 只接受ASCII可顯示字
valid_chars = "-_.() %s%s" % (string.printable, string.ascii_letters)
filename = ''.join(c for c in targetString if c in valid_chars)
其他16進制排除的方法也試過 沒效 估計該違法字其實不是16進制字元
沒梗了 能推薦好用的方法嗎?
語言版本: python 3以上
---------------------------------------------------------------
經過一番search 目前大概用了個替代解法如下
簡單說明下
因為python做系統編碼時
大概會把escape等unprintable字轉換成16進制
ex: 手邊實際遇到到的有 \x1b \x08 估計長度是4
所以先用repr 把違法字轉成可識別的hex str
接著迴圈撈char 針對\、x去排除4碼
大概上初步就完成了
(縮排請自行處理)
def format_filename(_titleName):
_titleName = repr(_titleName)
findSlash = False
findX = False
tmpCount = 0
totalName = ''
for i, tmpChr in enumerate(_titleName):
if tmpChr == '\\':
findSlash = True
continue
if findSlash == True:
if tmpChr == 'x':
findX = True
continue
if tmpCount >= 2:
findSlash = False
findX = False
tmpCount = 0
if findSlash is True and findX is True:
tmpCount = tmpCount + 1
continue
totalName = totalName + tmpChr
return totalName
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.46.215.208
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1495514710.A.E39.html
※ 編輯: pkmu8426 (114.46.215.208), 05/23/2017 12:52:36
推 Neisseria: 說實在的,Win 終端機的語系實在不好搞 05/23 15:10
→ Neisseria: 後來都用英文 Win 10,路徑只用英文 05/23 15:11
→ Neisseria: 英文版 Win 10 也可以輸入中文,上網抓一下輸入法即可 05/23 15:12
還沒試 不過看來經過string.printable
中文、日文 漢字就不行了
※ 編輯: pkmu8426 (114.46.223.227), 05/27/2017 12:15:27