#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, чтобы выяснить, существуют ли несвязанные расширения.