【问题标题】:Using regular expressions to read a file from a directory使用正则表达式从目录中读取文件
【发布时间】:2021-10-14 05:58:13
【问题描述】:

我有一个包含许多文件的目录。在我的 for 循环的每次迭代中,我想读取一个以

开头的文件
"stc_" + str(k) + "anything here" + "_alpha.mat"

这个k 在每次迭代中都会发生变化。如何使用正则表达式读取这样的文件?

只有一个文件开头带有"stc_" + str(k)。但是“这里的任何东西”都会因文件而异。

我知道一种选择是重写所有文件,但我想学习如何为此目的使用正则表达式。

【问题讨论】:

    标签: python python-3.x regex glob python-re


    【解决方案1】:

    您可以在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())
    

    【讨论】:

    • 非常感谢。然后,我想我还需要指定d的值。我怎样才能通过它?例如,在第一个循环中,我想读取 stc_0__alpha.mat 在第二个循环中,stc_1__alpha.mat 我还想传递 \d 的值
    • 然后只需将\d 替换为您想要的实际字符串。但这似乎效率太低了;只需按数字对文件进行排序。
    • ...但是你根本不需要正则表达式。
    【解决方案2】:

    你没有透露k的域,但是根据cmets,它似乎是一个数字。

    如果每个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)]
    

    这里,我们使用正则表达式分组括号来提取包含排序键和文件名的元组,然后在排序后丢弃排序键,只保留匹配文件的排序列表。 (另见Schwarzian transform.)

    跳过小于 7 或大于 24 的值的 if 子句演示了如何仅覆盖特定数字;如果你不需要那个,显然把它拿出来。

    访问磁盘的速度比处理内存中的数据慢 1000 倍,因此您通常希望避免重复访问磁盘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多