在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'
但我不知道如何着手。我没有看到fnmatch或glob的清晰路径,但我并不熟悉这些库。
我的想法是创建一个像这样的字符串:
filename = str('PRD.FRB.D01.INTRADAY.?.' + file_name_date + '.' + h_server + '.txt')
这将产生:
PRD.FRB.D01.INTRADAY.?.062917.12P.txt
,然后像做
glob(filename):
但不工作如预期。
有什么想法?谢谢!
使用glob
匹配诸如/home/juser/something/*.txt
路径名的所有文本文件中/home/juser directory
。您可以使用它来匹配当前工作目录中所有文本文件等简单文件名,如*.txt
。
fnmatch.fnmatch
和fnmatch.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
。
谢谢,但我试图减少时间,因为这个搜索很快就会变得昂贵,因为我知道日期和时间的组合,我将永远是独一无二的,在那里一种方法来封装。我看到你对Intraday和txt之间的内容有什么看法,但是它会返回数以千计的文件。如果我可以简单地通过今天的日期和时间函数,那将只返回一个文件,GVXXXX是无关紧要的,它是从我们的大型机推送的,我想要做的就是将它排除在寻找文件之外。 – Benloper
@Benloper我希望我这次能够帮到你。在你的问题中,你试图匹配''PRD.FRB.D01.INTRADAY。'。' + file_name_date +'。' + h_server'因为你使用'?'而不是'*',因为日期和时间是唯一的,所以''PRD.FRB.D01.INTRADAY。*。' + file_name_date +'。' + h_server'应该完成这项工作。这里有一个技巧,将未知部分改为'*',然后写出你知道的其余文件名(文件名的已知部分)。这有帮助吗? – direprobs
是的,我想我现在拥有它。我基本上做了你所说的,但是我确实把它放在了字符串中,然后把字符串传递给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)
运行时,第二天同样下拉同一个文件。过量撇号:'for glob.glob中的文件('PRD.FRB.D01.INTRADAY。* 。'+ file_name_date +'。'+ h_server +'.txt'):' - 除此之外,它似乎没问题。 –
对不起,修正了 – Stack
使用'os.listfiles'获取目录中的所有文件,并使用for循环来检查*** PRD.FRB.D01.INTRADAY。***是否在文件名中。 – Stack
这将最终需要一段时间,因为文件夹已满,所有文件名都将具有PRD.FRB.D01.INTRADAY,这是放入文件夹中的唯一东西。我的希望是为GGVXXX部分使用通配符,因为每一天都有独特的日期和时间,所以如果我正在搜索PRD.FRB.D01.INTRADAY。*。062917.11A.txt,它只会一直运行在PRD.FRB.D01.INTRADAY。*。063017.11A.txt – Benloper