判断字符串是否符合 Windows/Linux 目录规则
最近项目中有一个需求,需要对输入后,获取的字符串绝对路径检查是否符合路径规则,比如 Windows 中需要以盘符开始,其中不能有一些特殊字符,在修改文件夹名或文件名会提示这些特殊字符,有 9 个:\/:*?"<>|
。
为什么不能包括这些字符呢?这里不做探究,可以看下这篇文章:点击
Windows 系统代码实现
先看下代码,再结合具体代码来理解过程。
def check_windows_path(path):
# path = 'C:\\Users\\Administrator\\Downloads'
paths = path.split('\\') # ['C:', 'Users', 'Administrator', 'Downloads']
if len(paths) < 2: # path: 'C:'
return False
for i in range(len(paths)):
if paths[i] == '': # 文件夹名不能为空
return False
if len(paths[i]) > 224: # 文件夹名长度不能超过 224,具体和系统有关
return False
if i > 0: # 盘符之后开始
if ':' in paths[i]: # 文件夹名不能有冒号(:)
return False
else:
s = paths[i].strip()
if s != paths[i]: # 文件夹名前后不会有空格
return False
dirs1 = paths[i].split('/') # 文件夹名不会有 /
if len(dirs1) > 1:
return False
else:
if ':' not in paths[i]: # 盘符后应该跟着冒号(:)
return False
elif ' ' in paths[i]: # 盘符名中不能有空格
return False
else:
dirs2 = paths[i].split(':') # i = 'C:'
if len(dirs2) != 2: # 长度应该为 2
return False
if not re.search('[a-zA-Z]', dirs2[0]): # 盘符应为英文字母,不区分大小写
return False
valid_strs = ['?', '/', '|', '<', '>', '*', '"']
for valid_str in valid_strs:
if valid_str in paths: # 绝对路径中不能有以上列表中的字符
return False
return True
以上代码就是判断一个字符串路径是否符合规则,并且根据这个字符串创建文件夹。其实就是一一排除不正确的路径,需要注意的点,注释都写了。
linux 系统代码实现
还是先看下具体的代码。
def check_linux_path(path):
# path = '/home/zhangsh/Downloads'
if path[0] == '/': # linux 路径以 / 开始
paths = path.split('/') # ['', 'home', 'zhangsh', 'Downloads']
if len(paths) < 2: # 长度小于 2,说明路径为空
return False
for i in range(len(paths)):
if i != 0:
if paths[i] == '': # 列表中除第一个外,目录为空错误
return False
if paths[i].strip() != paths[i]: # 目录名有空格报错
return False
valid_strs = ['?', '/', '|', '<', '>', '*', '"', ':']
for valid_str in valid_strs:
if valid_str in path: # 路径中有以上非法字符报错
return False
return True
return False
linux 系统的路径,以 / 开始,非法字符与 Windows 系统中差不多,检查方法也大同小异,由于不需要判断盘符与冒号(:),过程似乎更简单一些。
总结
虽然有 os.path.isabs() 方法,但是此方法不能排除有特殊字符的路径,既然无法直接判断绝对路径是否符合规则,则可以一一排除不符合的,检查所获取绝对路径是否符合规则。