【问题标题】:How to use glob to read limited set of files with numeric names?如何使用 glob 读取具有数字名称的有限文件集?
【发布时间】:2014-07-07 06:46:46
【问题描述】:

如何使用 glob 只读取有限的文件集?

我在同一目录中有名为 50 到 20000 的数字的 json 文件(例如 50.json、51.json、52.json...19999.json、20000.json)。我只想读取编号从 15000 到 18000 的文件。

为此,我使用了一个 glob,如下所示,但每次我尝试过滤掉数字时,它都会生成一个空列表。我已尽力关注此链接 (https://docs.python.org/2/library/glob.html),但我不确定自己做错了什么。

>>> directory = "/Users/Chris/Dropbox"
>>> read_files = glob.glob(directory+"/[15000-18000].*")
>>> print read_files
[]

另外,如果我想要任何大于 18000 的文件怎么办?

【问题讨论】:

    标签: python path glob


    【解决方案1】:

    您错误地使用了 glob 语法; [..] 序列每个字符有效。以下 glob 将正确匹配您的文件:

    '1[5-8][0-9][0-9][0-9].*'
    

    在幕后,glob 使用fnmatch 将模式转换为正则表达式。您的模式转换为:

    >>> import fnmatch
    >>> fnmatch.translate('[15000-18000].*')
    '[15000-18000]\\..*\\Z(?ms)'
    

    .0158 之前的 1 字符匹配。没有别的了。

    glob 模式非常有限;匹配数字范围并不容易;您必须为范围创建 单独的 glob,例如(glob('1[8-9][0-9][0-9][0-9]') + glob('2[0-9][0-9][0-9][0-9]') 等)。

    改为进行您自己的过滤:

    directory = "/Users/Chris/Dropbox"
    
    for filename in os.listdir(directory):
        basename, ext = os.path.splitext(filename)
        if ext != '.json':
            continue
        try:
            number = int(basename)
        except ValueError:
            continue  # not numeric
        if 18000 <= number <= 19000:
            # process file
            filename = os.path.join(directory, filename)
    

    【讨论】:

    • 如果我只想在 18000 之后读取文件怎么办。您有什么建议吗?
    • 数字有多高? glob 真的很有限;从目录中读取所有文件名,然后过滤。您可以随时进行自己的过滤。
    • 嗯,随着时间的推移,正在添加文件。每天生成大约 50 个文件,我在文件 19000 上。我在执行 18000 到 29000 时遇到了问题:“/[1-2][0-9][0-9][0-9][ 0-9].*",因为我不想要 10000 到 18000
    • @Chris: glob 真的不适合那个任务。
    • 知道了,很高兴知道。谢谢 - 无论如何,这对我有很大帮助。
    【解决方案2】:

    虽然它算不上漂亮的代码,但您可以按如下方式实现自己的过滤:

    import os, re
    directory = "/Users/Chris/Dropbox"
    all_files = os.listdir(directory)
    
    read_files = [this_file for this_file in all_files 
                    if (int(re.findall('\d+', this_file)[-1]) > 18000)]
    
    print read_files
    

    这里的关键行(应该)遍历目录中的每个文件名(for this_file in all_files),提取该文件名(re.findall('\d+', this_file))中的数字段列表,如果这些数字段中的最后一个,作为一个整数,大于 18000。

    我认为这会破坏名称中没有整数的文件,所以用户要小心。


    编辑:我看到之前的答案已经过编辑,以包含看起来更好的深思熟虑的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多