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

通过对目录进行循环来构建Python字典

  •  -4
  • Julien  · 技术社区  · 8 年前

    “file42.json”、“file57.json”、“file65.json”、“file81.json”、“file90.json”。

    我想建一本这样的字典:

      {
    'file42.json' : 42, 
    'file97.json' : 57, 
    'file57.json' : 65, 
    'file81.json' : 81, 
    'file90.json' : 90
     }
    

    我试过下面的片段。。。

    for f in glob.glob("*.json"):
            d = {}
            d[f]=int(f[:-5])
            print d
    

    但我得到的结果是,这并不尊重字典应该是什么:

    {'file42.json': 10}
    {'file57.json': 11}
    {'file_65.json': 14}
    {'file_81.json': 15}
    {'file_90.json': 37}
    

    我怎样才能用 for -循环?
    谢谢!

    2 回复  |  直到 8 年前
        1
  •  1
  •   Quentin Herique    8 年前

    首先使用 os.listdir() ,然后删除除您用 strip() 功能:

    import os
    
    d = {}
    for file in os.listdir():
        d[file] = int(file.strip('file').strip('.json'))
    print(d)
    

    这样你得到:

     d = {
    'file42.json' : 42, 
    'file97.json' : 57, 
    'file57.json' : 65, 
    'file81.json' : 81, 
    'file90.json' : 90
     }
    
        2
  •  2
  •   Jean-François Fabre    8 年前

    错误是重新初始化循环中的dict。打印每个事件使其看起来像 建筑 一本字典,但实际上你不是。

    之后,你的切片是不正确的:你必须删除扩展名和前缀,所以简单的切片也不会剪切它,所以你得到的结果 不能 从你试图运行的代码开始。

    >>> import glob
    >>> import os
    >>> d = {k: int(os.path.splitext(k)[0][-2:]) for k in globi.glob("*.json")}
    >>> d
    {'file97.json': 97, 'file42.json': 42}
    

    对于该值,提取非扩展部分,取2个数字并转换。

    如果有一个或三个数字,则这不起作用,因此正则表达式可能是更好的选择:

    >>> import re
    >>> d = {k: int(re.search("\d+", os.path.splitext(k)[0]).group(0)) for k in glob.iglob("*.json")}