问题场景
使用glob来匹配所有特定扩展名的文件时,例如:
print("匹配结果: ", glob.glob(path.join('./[文字]文字', '*.txt')
运行却返回了空集,而我确信路径是正确的且存在匹配的文件
匹配结果: []
去掉方括号或者方括号内没有字符时则能匹配到。
问题原因
这是由于glob使用[]
来正则匹配任意内容,因此包含方括号时会被当做正则匹配,而当括号内为空时反而不受影响。
解决方案
方案一
将左右括号分别放在一组方括号里作为正则匹配,即[
改为[[]
,]
改为[]]
。
如果是动态生成的路径,可以用replace实现替换。这里需要一点小技巧,因为一旦进行多次替换就有可能错误地替换掉不应该替换的括号。
例如:
# 这样做会把第一次替换的括号破坏
path.replace('[', '[[]').replace(']', '[]]')
# 再替换一次,把错误的部分还回去
path.replace('[', '[[]').replace(']', '[]]').replace('[[[]]', '[[]')
# 先给左右括号前面分别加上一个标志 就可以依次替换了
path.replace('[', '_[') # 不使用斜线,因为也可能和路径分隔符混淆
path.replace(']', '_]')
path.replace('_]', '[]]')
由此看出我们可能无法找到一个完美的办法来替换它,只能根据需求使用最安全的方式。
方案二
用pathlib代替os.path和glob来操作。
从python3.4开始包含在标准库中,更早的版本需要手动安装
p = pathlib.Path(path)
p.glob("*.txt")
我个人更推荐第二种方法来解决,并且你还可以试着逐步用这个模块来汰换掉过去和文件操作相关的代码——它们有时候非常脏乱,用统一的方式管理可能更舒适。