Python сортировать файлы по типу и генерировать html код - PullRequest
1 голос
/ 06 августа 2020

Итак, у меня есть код, который генерирует код html для файлов в разных папках, сгруппированных по категориям, и возвращает словарь с этим кодом html, также сгруппированным по категориям, но окончательный код не содержит файлов. отсортировано по типам. Например:

папка 1 содержит: 2 файла csv и 1 файл ppt

папка 2 содержит: 3 файла csv

, поэтому сгенерированный html ставит первым элементы в папке 1 и затем 2. Я хочу, чтобы они были отсортированы по типу файла. Кроме того, есть ли способ устранить хотя бы один из for циклов?

my_dic={
    'category_1':['C:/Users/my_user/Desktop/folder1','C:/Users/my_user/Desktop/folder2']
}

def generate_html(dic_list_paths=my_dic):

    final_dic = {}
    html_file='<button type="button" class="collapsible">Archivos</button><div class="content">'
    html_images='<button type="button" class="collapsible">Imagenes</button><div class="content">'

    for key, items in dic_list_paths.items():
        name=key

        for item in items:
            for file in os.listdir(item):
                if '~$' not in file and file.endswith(('.csv','pptx')):
                    rel = os.path.join(item, file)

                    ruta = os.path.join(item, file)
                    filename, file_extension = os.path.splitext(ruta)
                    img = image_logo[file_extension]

                    html_file +=f'<div class="col-md-4 d-flex align-items-stretch"> <a href="{rel}" download> <p>{file}</p>'               
                    html_file +='</a></div>'

                elif file.endswith('jpg'):

                    html_images +='<div class="col-md-4 d-flex align-items-stretch"> <picture>'
                    html_images += f'<img src="{file}"'
                    html_images += """ class="lazy card-img-top" """
                    html_images += f'alt="{file}"'
                    html_images +='></picture> </div>'                  

        html_file+='</div>'
        html_images+='</div>'
        code=[html_file,html_images]
        final_dic[name]=code

    return final_dic

1 Ответ

1 голос
/ 06 августа 2020

Чтобы отсортировать файлы по расширению, вы можете просто использовать функцию сортировки в списке перед l oop. Чтобы объединить файлы из разных папок, сначала сделайте папку l oop, затем html l oop

for key, items in dic_list_paths.items():
    name=key

    allfiles=[]  # files from all folders
    for item in items:    # each folder
        for file in os.listdir(item):  # each file in folder
             allfiles += os.path.join(item, file)

    filesSorted = sorted(allfiles, key=lambda s: s[s.index('.'):]+s if '.' in s else s) # sort by extension
    for file in filesSorted:  # file includes path
        if '~$' not in file and file.endswith(('.csv','pptx')):
            rel = ruta = file  
            filename, file_extension = os.path.splitext(ruta)
            img = image_logo[file_extension]

            html_file +=f'<div class="col-md-4 d-flex align-items-stretch"> <a href="{rel}" download> <p>{file}</p>'               
            html_file +='</a></div>'

        elif file.endswith('jpg'):
            ........
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...