[英]Using regular expressions to read a file from a directory
我有一個包含許多文件的目錄。 在 for 循環的每次迭代中,我想讀取一個以
"stc_" + str(k) + "anything here" + "_alpha.mat"
這個k
在每次迭代中都會發生變化。 如何使用正則表達式來讀取這樣的文件?
只有一個文件以"stc_" + str(k)
開頭。 但是“這里的任何東西”會因文件而異。
我知道一種選擇是重寫所有文件,但我想學習如何為此目的使用正則表達式。
您可以使用os.listdir
上的filter
來實現:
import os
import re
def glob_re(pattern, strings):
return filter(re.compile(pattern).match, strings)
filenames = glob_re(r'stc_\d.*_alpha\.mat', os.listdir())
您沒有透露k
的域,但根據評論,它似乎是一個數字。
如果每個k
只有一個文件,您可以簡單地循環這些文件。
for knum in range(kmin, kmax+1):
for file in glob.glob("stc_%i*_alpha.mat" % knum):
# Only expect one match
process(file)
如果您真的一心想為此使用正則表達式,那么數字 7 到 24 的正則表達式就是(?:7|8|9|10|11|...|23|24)
(可以簡化為(?:[7-9]|1[0-9]|2[0-4])
但在這里,它可能不值得付出努力)。
os.listdir
將返回按字母順序排序的匹配文件; 如果您需要不同的排序順序,可以使用os.scandir
並提供您自己的排序功能。
my_files = []
for file in os.scandir(directory):
m = re.match(r'stc_(\d+).*_alpha\.mat', file)
if m:
# Maybe you only care about a particular range for k?
kcurr = int(m.group(1))
if kcurr < 7 or kcurr > 24:
continue
my_files.append(kcurr, file))
my_files = [x[1] for x in sorted(my_files)]
在這里,我們使用正則表達式分組括號提取包含排序鍵和文件名的元組,然后在排序后丟棄排序鍵,只保留匹配文件的排序列表。 (另見施瓦茲變換。)
跳過小於 7 或大於 24 的值的if
子句演示了如何只覆蓋特定的數字; 如果你不需要它,顯然把它拿出來。
訪問磁盤比在內存中處理數據慢 1,000 倍,因此您通常希望避免重復訪問磁盤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.