我在目录中有一个文件目录,命名为:
tx01.data
tx02.data
tx03.data
当我从命令行调用此模块时,我想传递一个参数以仅读取这些文件的子集范围,例如tx01.data和tx02.data(它将始终是连续范围,而不是文件的随机选择)。
我当前正在使用glob
读取目录中的所有文件。从我发现的情况来看,glob
不能很好地与子集配合使用。我找到的最接近的是this answer。
是否有更好的方法来读取可以从命令行传递的子集范围?
答案 0 :(得分:1)
这应该为您完成工作:
import argparse
import re
from os import listdir
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process some files.')
parser.add_argument("--range", type=str, help='file range (i.e. 0-100)', default='0-100')
args = parser.parse_args()
try:
file_range = list(map(int, args.range.split('-')))
except Exception as e:
raise Exception('Invalid parameter format...\n%s' % e)
dir_files = listdir('.')
matches_list = list(map(lambda x: re.match(r'm([0-9]+)\.data', x), dir_files))
files = [x.group() for x in matches_list if x and (file_range[0] <= int(x.groups()[0]) <= file_range[1])]
print(files)
命令应如下所示:
python script.py-范围0-200
答案 1 :(得分:0)
一种解决方案是在命令行中传递两个数字以告知范围:
choose.py
#!/usr/bin/env python3
import re
import sys
from pathlib import Path
def main():
first, last = sys.argv[1:]
pattern = re.compile(rf'tx0?[{first}-{last}]\.data$')
# pattern = re.compile(r'tx0?[{}-{}]\.data$'.format(first, last))
for p in Path().glob('*'):
if pattern.match(p.name):
print(p.name)
if __name__ == '__main__':
main()
$ python3 choice.py 2 4
tx02.data
tx03.data
tx04.data