在Glob中使用部分通配符

问题描述:

我一直无法找到这个用例,但基本上我试图利用glob来获取文件名的一部分。在Glob中使用部分通配符

file_name_date = time.strftime("%m%d%y") 
h_server = time.strftime("%-I%p")  
filename = 'PRD.FRB.D01.INTRADAY.GGV1051.' + file_name_date + '.' + h_server + '.txt' 

这工作在我的代码正常,但是现在GGV1051与每个文件的改变,所以我希望做这样的事情

filename = glob('PRD.FRB.D01.INTRADAY.' + * + '.' + file_name_date + '.' + h_server + '.txt' 

但我不知道如何着手。我没有看到fnmatchglob的清晰路径,但我并不熟悉这些库。

我的想法是创建一个像这样的字符串:

filename = str('PRD.FRB.D01.INTRADAY.?.' + file_name_date + '.' + h_server + '.txt') 

这将产生:

PRD.FRB.D01.INTRADAY.?.062917.12P.txt 

,然后像做

glob(filename): 

但不工作如预期。

有什么想法?谢谢!

+0

使用'os.listfiles'获取目录中的所有文件,并使用for循环来检查*** PRD.FRB.D01.INTRADAY。***是否在文件名中。 – Stack

+0

这将最终需要一段时间,因为文件夹已满,所有文件名都将具有PRD.FRB.D01.INTRADAY,这是放入文件夹中的唯一东西。我的希望是为GGVXXX部分使用通配符,因为每一天都有独特的日期和时间,所以如果我正在搜索PRD.FRB.D01.INTRADAY。*。062917.11A.txt,它只会一直运行在PRD.FRB.D01.INTRADAY。*。063017.11A.txt – Benloper

使用glob匹配诸如/home/juser/something/*.txt路径名的所有文本文件中/home/juser directory。您可以使用它来匹配当前工作目录中所有文本文件等简单文件名,如*.txt

fnmatch.fnmatchfnmatch.filter用于filenmaes。前者测试文件名是否匹配模式,并返回True表示匹配的名称,否则返回False表示不匹配的名称。后者根据给定的glob模式返回匹配的文件名。

所有的文件名都以PRD.FRB.D01.INTRADAY开头。并以.txt后缀结尾,然后匹配以PRD.FRB.D01.INTRADAY开头的所有文件。并结束与.TXT不论什么在中间:

glob.glob("PRD.FRB.D01.INTRADAY.*.txt") 

这水珠与PRD.FRB.D01.INTRADAY开头的文件名匹配。并以.txt后缀结尾,这与PRD.FRB.D01.INTRADAY之后的内容无关。 *通配符匹配任何任意字符。 ?只匹配一个任意字符。注意,这会匹配脚本的工作目录中的文件名。如果您需要匹配不同目录中的名称,请将"/path/to/my/PRD.FRB.D01.INTRADAY.*.txt"更改为glob

+0

谢谢,但我试图减少时间,因为这个搜索很快就会变得昂贵,因为我知道日期和时间的组合,我将永远是独一无二的,在那里一种方法来封装。我看到你对Intraday和txt之间的内容有什么看法,但是它会返回数以千计的文件。如果我可以简单地通过今天的日期和时间函数,那将只返回一个文件,GVXXXX是无关紧要的,它是从我们的大型机推送的,我想要做的就是将它排除在寻找文件之外。 – Benloper

+0

@Benloper我希望我这次能够帮到你。在你的问题中,你试图匹配''PRD.FRB.D01.INTRADAY。'。' + file_name_date +'。' + h_server'因为你使用'?'而不是'*',因为日期和时间是唯一的,所以''PRD.FRB.D01.INTRADAY。*。' + file_name_date +'。' + h_server'应该完成这项工作。这里有一个技巧,将未知部分改为'*',然后写出你知道的其余文件名(文件名的已知部分)。这有帮助吗? – direprobs

+0

是的,我想我现在拥有它。我基本上做了你所说的,但是我确实把它放在了字符串中,然后把字符串传递给glob,这很有效。 filename = str('PRD.FRB.D01.INTRADAY。*。'+ file_name_date +'。'+ h_server +'.txt') filenames = glob.glob(filename) – Benloper

这应该工作,星号符号*也应该是一个字符串。

import glob 
all_files = [] 
for file in glob.glob('PRD.FRB.D01.INTRADAY.*.' + file_name_date + '.' + h_server + '.txt''): 
    all_files.append(file) 
+0

运行时,第二天同样下拉同一个文件。过量撇号:'for glob.glob中的文件('PRD.FRB.D01.INTRADAY。* 。'+ file_name_date +'。'+ h_server +'.txt'):' - 除此之外,它似乎没问题。 –

+0

对不起,修正了 – Stack