作者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://webptt.com/cn.aspx?n=bbs/Python/M.1495514710.A.E39.html
※ 编辑: pkmu8426 (114.46.215.208), 05/23/2017 12:52:36
2F:推 Neisseria: 说实在的,Win 终端机的语系实在不好搞 05/23 15:10
3F:→ Neisseria: 後来都用英文 Win 10,路径只用英文 05/23 15:11
4F:→ Neisseria: 英文版 Win 10 也可以输入中文,上网抓一下输入法即可 05/23 15:12
还没试 不过看来经过string.printable
中文、日文 汉字就不行了
※ 编辑: pkmu8426 (114.46.223.227), 05/27/2017 12:15:27