代码之家  ›  专栏  ›  技术社区  ›  Adam_G

读取目录中的文件子集

  •  0
  • Adam_G  · 技术社区  · 6 年前

    我在一个目录中有一个文件目录,名称如下:

    tx01.data
    tx02.data
    tx03.data
    

    当我从命令行调用这个模块时,我想传递一个参数来只读这些文件的子集范围,例如tx01.data和tx02.data(它总是一个连续的范围,而不是随机选择的文件)。

    我正在使用 glob 读取目录中的所有文件。根据我的发现, 格洛布 在细分市场上表现不佳。我找到的最接近的是 this answer .

    是否有更好的方法读取可以从命令行传入的子集范围?

    2 回复  |  直到 6 年前
        1
  •  1
  •   JAponte    6 年前

    这应该可以为您完成以下工作:

    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

        2
  •  0
  •   Waket Zheng    6 年前

    一种解决方案是在命令行中传递两个数字来告诉范围:

    选择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 choose.py 2 4年

    tx02.data
    tx03.data
    tx04.data