在Linux上忽略glob()中的大小写

我正在编写一个脚本,它必须处理由Windows和Linux用户手动修改的目录。 Windows用户往往不关心分配文件名的情况。

有没有办法在Python的Linux端处理这个问题,也就是说,我能得到一个不区分大小写的类似glob的行为吗?

Solutions Collecting From Web of "在Linux上忽略glob()中的大小写"

使用不区分大小写的正则表达式而不是全局模式。 fnmatch.translate从glob模式生成一个正则表达式,所以

 re.compile(fnmatch.translate(pattern), re.IGNORECASE) 

为您提供一个glob模式的不区分大小写的版本作为编译的RE。

请记住,如果文件系统是由类似Unix的文件系统上的Linux机器托管的,则用户将能够在相同的目录中创建文件fooFooFOO

您可以用[cC]替换每个字母字符c

 import glob def insensitive_glob(pattern): def either(c): return '[%s%s]'%(c.lower(),c.upper()) if c.isalpha() else c return glob.glob(''.join(map(either,pattern))) 

非递归

为了检索“路径”目录的文件(和仅文件),使用“globexpression”:

 list_path = [i for i in os.listdir(path) if os.path.isfile(os.path.join(path, i))] result = [os.path.join(path, j) for j in list_path if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)] 

递归

与步行:

 result = [] for root, dirs, files in os.walk(path, topdown=True): result += [os.path.join(root, j) for j in files \ if re.match(fnmatch.translate(globexpression), j, re.IGNORECASE)] 

更好的是编译正则表达式,而不是

 re.match(fnmatch.translate(globexpression) 

做(循环之前):

 reg_expr = re.compile(fnmatch.translate(globexpression), re.IGNORECASE) 

然后在循环中替换:

  result += [os.path.join(root, j) for j in files if re.match(reg_expr, j)] 

根据您的情况,您可以对文件模式和文件夹列表的结果使用.lower() ,然后只将该模式与文件名进行比较