Проверьте тип расширения изображения папки и убедитесь, что все изображения имеют один формат

#python #python-3.x

#питон #python-3.x

Вопрос:

Я делаю проект, связанный с компьютерным зрением. Поскольку мне всегда нравится писать аккуратный код (хотя у меня нет формального обучения программированию), я должен задать здесь несколько вопросов. Пожалуйста, потерпите меня.

Есть несколько вещей, которых я хочу достичь с помощью следующей функции.

Во-первых, он проверяет тип расширения и убедитесь, что они имеют формат jpg, jpeg или png (но этот список настраивается).

Во-вторых, он проверяет папку с изображениями и убеждается, что все они имеют одинаковый тип расширения, никаких сюрпризов, таких как 100 изображений с «.jpg», в то время как остальные «.png».

Наконец, функция должна, наконец, вернуть тип расширения, чтобы я мог сделать что-то подобное в своем конвейере:

 image_path = os.path.join(path_to_image, image_id check_file_type(image_folder_path))
 

PS: Есть ли какой-нибудь способ соединить две строки без использования оператора , это
действительно выглядит некрасиво (но это просто моя любимая мозоль).

Моя функция заключается в следующем, я всегда чувствую, что с ней что-то не так, хотя, кажется, она работает нормально, я был бы признателен кому-то с опытом, чтобы исправить / улучшить мою функцию и не выглядеть громоздким.

 from collections import Counter
from tqdm import tqdm
from type import Optional, List

def check_file_type(image_folder_path, allowed_extensions:Optional[List]=None):
    if allowed_extensions is None:
        allowed_extensions = ['.jpg', '.png', '.jpeg']

    extension_type = []
    file_list = os.listdir(image_folder_path)
    for file in tqdm(file_list):
        extension_type.append(os.path.splitext(file)[-1].lower())
    
    extension_dict = Counter(extension_type)
    assert len(extension_dict.keys()) == 1, "The extension in the folder should all be the same, but found {} extensions".format(extension_dict.keys)
    extension_type = list(extension_dict.keys())[0]
    assert extension_type in allowed_extensions
    return extension_type
 

Комментарии:

1. ваш код выглядит хорошо. почему вы считаете, что ваш код не очень хорош?

2. Поскольку у меня нет формального обучения этому, я не чувствую себя уверенно и хочу искать уверенности у лучших людей 🙂

3. Одно из улучшений, которое вы можете сделать, это использовать понимание списка. вы можете заменить средние 4 строки следующим образом extension_type = [os.path.splitext(file)[-1].lower() for file in os.listdir(image_folder_path)]

4. для строкового вопроса вы можете использовать fstring

5. По сути, вы хотите прочитать все изображения с заданным списком расширений (например, [‘jpg’, ‘png’, ‘jpeg’]) из заданной папки и игнорировать все остальные изображения с любым другим расширением??

Ответ №1:

Если вы не хотите использовать коллекции и не хотите перебирать каждый файл в папке, вы можете сделать что-то вроде этого.

 import glob

def check_file_type(image_folder_path, allowed_extensions=None):
    if allowed_extensions is None:
        allowed_extensions = ['.jpg', '.png', '.jpeg']

    no_files_in_folder = len(glob.glob(image_folder_path "/*")) 
    extension_type = ""
    no_files_allowed = 0

    for ext in allowed_extensions:
      no_files_allowed = len(glob.glob(image_folder_path "/*" ext))
      if no_files_allowed > 0:
        extension_type = ext
        break

    assert no_files_in_folder == no_files_allowed, "The extension in the folder should all be the same, but found more than one extensions"
    return extension_type
 

Сначала получите общее количество файлов, которые у вас есть в папке

Затем получите количество файлов для каждого разрешенного расширения, если glob получает более одного файла для расширения, цикл прервется, и assert проверит, является ли no_files_in_folder == no_files_allowed

если true, он вернет тип расширения

если false, то в этой папке наверняка есть файлы с более чем одним расширением

Ответ №2:

 import glob
from pathlib import Path
import os

folder_path = Path.home() / "Desktop"

# Set of allowed extensions
allowed_exts = {".png", ".jpg"}

# Set of extensions present in the directory
extensions_present = {
    Path(i).suffix
        for i in glob.glob(str(folder_path / "*"))
        if Path(i).suffix # do not take empty '' strings.
}

print(extensions_present)
print(extensions_present - allowed_exts)

if len(extensions_present - allowed_exts) > 0:
    print("Unrelated extensions found.")
 

Вы можете создать набор разрешенных расширений, а затем выполнить set difference, чтобы выяснить, существуют ли несвязанные расширения.