我有一個包含許多檔案的目錄。在 for 回圈的每次迭代中,我想讀取一個以
"stc_" str(k) "anything here" "_alpha.mat"
這k在每次迭代中都會發生變化。如何使用正則運算式來讀取這樣的檔案?
"stc_" str(k)開頭只有一個檔案。但是“這里的任何東西”都會因檔案而異。
我知道一種選擇是重寫所有檔案,但我想學習如何為此目的使用正則運算式。
uj5u.com熱心網友回復:
你可以用filteron做到os.listdir:
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())
uj5u.com熱心網友回復:
你沒有透露 的域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)]
在這里,我們使用正則運算式分組括號提取包含排序鍵和檔案名的元組,然后在排序后丟棄排序鍵,只保留匹配檔案的排序串列。(另見施瓦茲變換。)
if跳過小于 7 或大于 24 的值的子句演示了如何只覆寫特定的數字;如果你不需要它,顯然把它拿出來。
訪問磁盤比在記憶體中處理資料慢 1,000 倍,因此您通常希望避免重復訪問磁盤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/315087.html
