【问题标题】:how filter filename if not include 01.jpg from multi sub directory如果不包含来自多子目录的 01.jpg,如何过滤文件名
【发布时间】:2018-10-04 08:15:34
【问题描述】:

我有类似的目录结构 图片包括dir_one、dir_two

dir_one 不包含任何目录

dir_two 包括 dir_three

dir_three 不包含任何目录

dir_one包括01.jpg、02.jpg

dir_two包括02.jpg、03.jpg

dir_three包括02.jpg、03.jpg、04.jpg

我想得到一个关于 dir 路径的列表,如果 dir 不包括 01.jpg
将追加到一个列表,然后我将转换为一个 json 文件

    import json
import os
def file_name(file_dir):
    L=[]
    for dirpath, dirnames, filenames in os.walk(file_dir):
        for file in filenames :
            if os.path.splitext(file)[1] == '.jpg':
                L.append(os.path.join(dirpath, file))
    return L

file_dir = 'F:\\tmp\\images'
files_list=file_name(file_dir)

item_list = set()
for item in files_list:
    print(item[-6:])
    index_of_dir_path = item.rfind('\\')
    filter_str='01.jpg'
    # if filter_str not in files_list:
    if filter_str not in item:
        item_list.add(item[0:index_of_dir_path])

json_data = {
    "dirPath_not_include_01_jpg_file":list(item_list)
}
target_json_path='out.json'
with open(target_json_path, 'w') as f:
    json_dumps = json.dumps(json_data, f, ensure_ascii=False, indent=2)
    f.write(json_dumps)

我希望制作一个不包含dir_one项目路径的json文件(因为dir_one包含01.jpg)

{
  "dirPath_not_include_01_jpg_file": [
    "F:\\tmp\\images\\dir_two\\dir_three",
    "F:\\tmp\\images\\dir_four",
    "F:\\tmp\\images\\dir_five",
    "F:\\tmp\\images\\dir_two"
  ]
}

但不是代码将包含 dir_one 项目路径

{
  "dirPath_not_include_01_jpg_file": [
    "F:\\tmp\\images\\dir_two\\dir_three",
    "F:\\tmp\\images\\dir_one",
    "F:\\tmp\\images\\dir_four",
    "F:\\tmp\\images\\dir_five",
    "F:\\tmp\\images\\dir_two"
  ]
}

【问题讨论】:

    标签: python filter directory filenames


    【解决方案1】:

    您应该在for 循环之外初始化item_list;否则每次迭代都会覆盖其先前的值。您还应该将item_list 设置为一组,这样如果同一目录下有多个.jpg 文件,它们就不会导致列表中出现重复的目录:

    item_list=set()
    for item in files_list:
        print(item)
        index_of_dir_path = item.rfind('\\')
        print(item[0:index_of_dir_path])
        item_list.add(item[0:index_of_dir_path])
    json_data = {
        "dirPath_not_include_01_jpg_file":list(item_list)
    }
    

    如果您想排除包含01.jpg 的目录,您还应该在将文件添加到列表之前对其进行检查:

    for dirpath, dirnames, filenames in os.walk(file_dir):
        if all('01.jpg' not in file for file in filenames):
            for file in filenames :
                if os.path.splitext(file)[1] == '.jpg':
                    L.append(os.path.join(dirpath, file))
    

    【讨论】:

    • 天哪!祝你如此优秀!!谢谢亲爱的朋友
    • 是否要删除重复项?
    • 您可以改用set,然后在添加到json_data 时将其转换回列表。请查看我的更新答案。
    • 再次感谢您,实际上我无法添加我的关键问题代码,即 find dir full path not include '01.jpg',我也再次更新我的问题
    • 只需将if filter_str not in files_list: 更改为if filter_str not in item:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多