如何使用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的文件怎么办?
答案 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 字符,0
,1
,5
或8
。没别了。
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。
我认为这会破坏名称中没有整数的文件,所以用户要小心。
编辑:我看到之前的答案已经过编辑,其中包含了更好的思考方式。