为什么python glob.glob不匹配任何带有我传入的通配符的文件?

为什么python glob.glob不匹配任何带有我传入的通配符的文件?,python,glob,Python,Glob,例如: 20190108JPYUSDabced.csv 20190107JPYUSDabced.csv 20190106JPYUSDabced.csv 当我从终端搜索前2个文件时: bash: ls /Users/Downloads/201901{08,07}JPYUSDabced.csv it gives me the first 2 files (exclude 20190106JPYUSDabced.csv) 当我使用python时: import glob glob.glob('/U

例如:

20190108JPYUSDabced.csv
20190107JPYUSDabced.csv
20190106JPYUSDabced.csv
当我从终端搜索前2个文件时:

bash: ls /Users/Downloads/201901{08,07}JPYUSDabced.csv
it gives me the first 2 files (exclude 20190106JPYUSDabced.csv)
当我使用python时:

import glob
glob.glob('/Users/Downloads/201901{08,07}JPYUSDabced.csv')
it gives me []

根据模块的文档,引擎盖下的
glob
使用。
fnmatch
doc描述的唯一模式是:

对于文字匹配,请将元字符括在括号中。例如,“[?]”与字符“?”匹配

请尝试使用括号中的字符序列:

glob.glob('/Users/Downloads/2019010[87]JPYUSDabced.csv')
使用os.walk 假设您希望搜索特定的日期范围,那么您可能需要尝试与正则表达式一起使用,以获得所需的更复杂的模式

警告:
os.walk
递归地从起始位置遍历每个目录,这可能不是您想要的

您必须根据您的情况调整正则表达式,但以下是一个示例:

正则表达式与日期
20181208
或日期
20190107
匹配,但必须包含标识符
JPYUSDabced.csv

regex = re.compile("(?:(?:20181208)|(?:20190107))JPYUSDabced.csv")

files = []
for dirpath, dirnames, filenames in os.walk('/Users/Downloads'):
    for f in filenames:
        if regex.match(f):
            files.append(os.path.join(dirpath, f))
print(files)
# ['/Users/Downloads/20190107JPYUSDabced.csv', '/Users/Downloads/20181208JPYUSDabced.csv']

根据模块的文档,引擎盖下的
glob
使用。
fnmatch
doc描述的唯一模式是:

对于文字匹配,请将元字符括在括号中。例如,“[?]”与字符“?”匹配

请尝试使用括号中的字符序列:

glob.glob('/Users/Downloads/2019010[87]JPYUSDabced.csv')
使用os.walk 假设您希望搜索特定的日期范围,那么您可能需要尝试与正则表达式一起使用,以获得所需的更复杂的模式

警告:
os.walk
递归地从起始位置遍历每个目录,这可能不是您想要的

您必须根据您的情况调整正则表达式,但以下是一个示例:

正则表达式与日期
20181208
或日期
20190107
匹配,但必须包含标识符
JPYUSDabced.csv

regex = re.compile("(?:(?:20181208)|(?:20190107))JPYUSDabced.csv")

files = []
for dirpath, dirnames, filenames in os.walk('/Users/Downloads'):
    for f in filenames:
        if regex.match(f):
            files.append(os.path.join(dirpath, f))
print(files)
# ['/Users/Downloads/20190107JPYUSDabced.csv', '/Users/Downloads/20181208JPYUSDabced.csv']

从文档中看到,我认为python的glob库不支持
{opt1,opt2}
语法。至少,glob上没有提到它。glob在后台使用,它似乎不支持所有shell通配符,包括
{…}
。这是自2011年以来一直在讨论的问题。。从文档中看到,我认为python的glob库不支持
{opt1,opt2}
语法。至少,glob上没有提到它。glob在后台使用,它似乎不支持所有shell通配符,包括
{…}
。这是自2011年以来一直在讨论的问题。。实际情况更加复杂,因为[8,7]不起作用。20181208JPYUSDabced.csv 20190107JPYUSDabced.csv 20190106JPYUSDabced.csv,我想要glob的前两个文件。glob@Maik你的真正目标是:列出所有标有2个特定日期的文件吗?同样是ware
glob.glob('/Users/Downloads/2019010[8,7]JPYUSDabced.csv')
也匹配
'/Users/Downloads/2019010,JPYUSDabced.csv“”
,我想这不是OP想要的。匹配seq中的任何字符意味着“任何字符”(包括
,它恰好也是答案中的字符)。@OndrejK。哎呀,;你说得对。删除了逗号。啊,我知道你一开始就把它删掉了。对此很抱歉是的,我仍然担心它只适用于所讨论的示例,但实际上OP可能需要
“{09,10}”
例如,或者更复杂的模式,并且与
[seq]
符号不符。我想“os.walk()或诸如此类和正则表达式过滤器的组合最终将是解决方案。实际情况更复杂,因为[8,7]不起作用。20181208JPYUSDabced.csv 20190107JPYUSDabced.csv 20190106JPYUSDabced.csv,我想要glob的前两个文件。glob@Maik你的真正目标是:列出所有标有2个特定日期的文件吗?同样是ware
glob.glob('/Users/Downloads/2019010[8,7]JPYUSDabced.csv')
也匹配
'/Users/Downloads/2019010,JPYUSDabced.csv“”
,我想这不是OP想要的。匹配seq中的任何字符意味着“任何字符”(包括
,它恰好也是答案中的字符)。@OndrejK。哎呀,;你说得对。删除了逗号。啊,我知道你一开始就把它删掉了。对此很抱歉是的,我仍然担心它只适用于所讨论的示例,但实际上OP可能需要
“{09,10}”
例如,或者更复杂的模式,并且与
[seq]
符号不符。我想,‘os.walk()或诸如此类和正则表达式过滤器的组合最终将是解决方案。