如何使用glob来读取带有数字名称的有限文件集?

时间:2014-05-19 10:35:07

标签: python path glob

如何使用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的文件怎么办?

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

glob模式非常有限;匹配数值范围并不容易;你必须为范围创建单独的 globs,例如(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)

答案 1 :(得分:3)

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

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))中的数字段列表,并将其包含在{ {1}}如果这些数字段中的最后一个作为整数大于18000。

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


编辑:我看到之前的答案已经过编辑,其中包含了更好的思考方式。