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

在两个文件夹中查找名称首字母相同的文件

  •  3
  • DeltaIV  · 技术社区  · 8 年前

    我用过 listdir 要读取两个文件夹中的文件,请执行以下操作:

    from os import listdir 
    list_1 = [file for file in listdir("./folder1/") if file.endswith(".csv")]
    list_2 = [file for file in listdir("./folder2/") if file.endswith(".json")]
    

    现在我有两个列表:

    list_1 = ['12_a1_pp.csv', '32_a3_pp.csv', '45_a17_pp.csv', '81_a123_pp.csv']
    list_2 = ['12_a1.json', '32_a3.json', '61_a54.json']
    

    我想找到对应的两个子列表,其中包含名称的初始部分相同的文件。换句话说:

    list_1b = ['12_a1_pp.csv', '32_a3_pp.csv']
    list_2b = ['12_a1.json', '32_a3.json']
    

    我该怎么做?

    PS注意 listdir公司 回答这个问题,部分可能无关紧要。我只把它包括在内,因为如果 listdir公司 保证按字母顺序排列,那么这可能有助于遍历这两个列表。当然,在这个简单的示例中,列表很短,但在实际用例中,它们包含数百个文件。

    4 回复  |  直到 8 年前
        1
  •  2
  •   sciroccorics    8 年前

    更具python风格的方法将使用 & 集合的(交点)运算符:

    common = set(x[:-7] for x in list_1) & set(x[:5] for x in list_2)
    list_1b = [x + '_pp.csv' for x in common]
    list_2b = [x + '.json' for x in common]
    

    编辑:如果需要对每个列表的特定字符进行拆分(请参见注释),以下是更新版本(在列表\u 1中搜索最后一个“\u”,在列表\u 2中搜索最后一个“.”):

    common = set(x[:x.rindex('_')] for x in list_1) & set(x[:x.rindex('.')] for x in list_2)
    
        2
  •  2
  •   jpp    8 年前

    这是一种使用字典理解和 set.intersection 。

    list_1 = ['12_a1_pp.csv', '32_a3_pp.csv', '45_a17_pp.csv', '81_a123_pp.csv']
    list_2 = ['12_a1.json', '32_a3.json', '61_a54.json']
    
    start_1 = {k: '_'.join(k.split('_')[:-1]) for k in list_1}
    start_2 = {k: k.split('.')[0] for k in list_2}
    
    start_intersect = set(start_1.values()) & set(start_2.values())
    
    list_1b = [k for k, v in start_1.items() if v in start_intersect]
    list_2b = [k for k, v in start_2.items() if v in start_intersect]
    

    如果任何“XY”的文件名都以“\u XY.csv”结尾,则此方法同样适用。它依赖于文件名的格式,而不是invidual字母。

        3
  •  1
  •   Rakesh    8 年前
    list_1 = ['12_a1_pp.csv', '32_a3_pp.csv', '45_a17_pp.csv', '81_a123_pp.csv']
    list_2 = ['12_a1.json', '32_a3.json', '61_a54.json']
    
    list_1_C = [i.split(".")[0].replace("_pp", "") for i in list_1]     #Check List
    list_2_C = [i.split(".")[0] for i in list_2]                        #Check List
    
    print([list_1[i] for i, v in enumerate(list_1_C) if v in list_2_C])
    print([list_2[i] for i, v in enumerate(list_2_C) if v in list_1_C])
    

    输出:

    ['12_a1_pp.csv', '32_a3_pp.csv']
    ['12_a1.json', '32_a3.json']
    
        4
  •  1
  •   Kenstars    8 年前

    这一点很简单,你可以这样想:

    list_1 = ['12_a1_pp.csv', '32_a3_pp.csv', '45_a17_pp.csv', '81_a123_pp.csv']
    list_2 = ['12_a1.json', '32_a3.json', '61_a54.json']
    starters = [eachfile.partition(".")[0] for eachfile in list2]
     for eachelement in starters:
        for eachfile in list_1:
           if eachfile.startswith(eachelement):
              list_1b.append(eachfile)
              list_2b.append(eachelement+".json")
    

    此外,如果您想针对这种情况:

    collective_set_1 = { each.replace("_pp.csv","") for each in list_1}
    collective_set_2 = { each.replace(".json","") for each in list_2}
    intersection = collective_set_1.intersection(collective_set2)
    list_1b = [ each+"_pp.csv" for each in intersection ]
    list_2b = [ each+".json" for each in intersection ]