簡體   English   中英

使用正則表達式從目錄中讀取文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM