Расширение файла PYTHON
Расширение файла PYTHON имеет один тип (-ов) файла (-ов) и связано с один различными программными обеспечениями, но главным образом с Python, разработанным Python Software Foundation. Часто они представлены в формате Python Script File. Чаще всего файлы PYTHON классифицируют, как Developer Files.
Расширение файла PYTHON поддерживается Windows, Mac и Linux. Данные типы файлов можно найти в основном на настольных компьютерах и некоторых мобильных устройствах. Рейтинг популярности данных файлов составляет «Низкий» и они обычно не используются.
Подробную информацию о файлах PYTHON и программах, с помощью которых они открываются, см. далее. Кроме того, далее также представлены сведения о простых способах устранения неполадок, которые помогут вам открыть файл PYTHON.
Путь, имя и расширение файла
Достаточно часто возникают ситуации, когда у нас есть полное имя файла, а требуется узнать его расширение. Или добавить нужное расширение, когда не известно, ввел его пользователь или нет. Иногда у нас есть относительный путь до файла, а требуется узнать абсолютный. Про основные методы работы с именем файла и будет эта статья.
Абсолютный путь к файлу
Для того чтобы узнать в Python абсолютный путь к файлу, потребуется воспользоваться библиотекой os. Её подключаем с помощью команды import os. В классе path есть метод abspath. Вот пример использования.
import os p = os.path.abspath('file.txt ') print(p) C:\python3\file.txt
Так же можно воспользоваться и стандартной библиотекой pathlib. Она вошла в состав основных библиотек, начиная с версии Python 3.4. До этого надо было ее инсталлировать с помощью команды pip install pathlib. Она предназначена для работы с путями файловой системы в разных ОС и отлично подойдет для решения данной задачи.
import pathlib p = pathlib.Path('file.txt ') print(p) C:\python3\file.txt
Имя файла
Чтобы узнать имя файла из полной строки с путем, воспользуемся методом basename модуля os.
import os name = os.path.basename(r'C:\python3\file.txt ') print(name) file.txt
Здесь перед строкой вставил r, чтобы подавить возможное возникновение служебных символов. Например, в данном случае если не указать r, то \f считалось бы символом перевода страницы.
Без расширения
Теперь разберемся, как в Python узнать имя файла без расширения. Воспользуемся методом splittext. В этот раз для примера возьмем файл с двойным расширением, чтобы проверить, как будут в этой ситуации работать стандартны функции.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[0] print(name) file.tar
Видно, что последнее расширение архиватора gz было отброшено, в то время как расширение несжатого архива tar осталось в имени.
Если же нам нужно только имя, то можно отбросить все символы полученной строки, которые идут после первой точки. Символ точки тоже отбросим.
Дополним предыдущий пример следующим кодом:
index = name.index('.') print(name[:index]) file
Расширение файла
В Python получить расширение файла можно аналогичным образом с помощью той же функции splitext. Она возвращает кортеж. Первый элемент кортежа имя, а второй – расширение. В данном случае нам нужен второй элемент. Индекс второго элемента равен единице, так как отсчет их идет от нуля.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[1] print(name) .gz
Аналогично можно воспользоваться библиотекой pathlib. Воспользуемся методом suffix.
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffix) .gz
Но в нашем случае два расширения. Их можно узнать с помощью функции suffixes. Она возвращает список, элементами которого и будут расширения. Ниже приведен пример получения списка расширений.
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffixes) ['.tar', '.gz ']
Для того, чтобы получить имя файла или расширение из полного пути или для получения абсолютного пути к файлу используйте библиотеки os и pathlib. Лучше воспользоваться готовым решением из стандартой библиотеками, чем писать свое решение.
Как получить расширение и размер файла в Python
Мы можем использовать функцию splitext() модуля os в Python, чтобы получить расширение файла. Эта функция разбивает путь к файлу на кортеж, имеющий два значения – корень и расширение.
Вот простая программа для получения расширения файла на Python.
import os # unpacking the tuple file_name, file_extension = os.path.splitext("/Users/pankaj/abc.txt") print(file_name) print(file_extension) print(os.path.splitext("/Users/pankaj/.bashrc")) print(os.path.splitext("/Users/pankaj/a.b/image.png"))

- В первом примере мы напрямую распаковываем значения кортежа в две переменные.
- Обратите внимание, что файл .bashrc не имеет расширения. К имени файла добавляется точка, чтобы сделать его скрытым.
- В третьем примере в имени каталога есть точка.
Получение расширения файла с помощью модуля Pathlib
Мы также можем использовать модуль pathlib, чтобы получить расширение файла. Этот модуль был представлен в версии Python 3.4.
>>> import pathlib >>> pathlib.Path("/Users/pankaj/abc.txt").suffix '.txt' >>> pathlib.Path("/Users/pankaj/.bashrc").suffix '' >>> pathlib.Path("/Users/pankaj/.bashrc") PosixPath('/Users/pankaj/.bashrc') >>> pathlib.Path("/Users/pankaj/a.b/abc.jpg").suffix '.jpg' >>>
Всегда лучше использовать стандартные методы, чтобы получить расширение файла. Если вы уже используете модуль os, используйте метод splitext(). Для объектно-ориентированного подхода используйте модуль pathlib.
Получение размера файла
Мы можем получить размер файла в Python, используя модуль os.
Модуль os имеет функцию stat(), где мы можем передать имя файла в качестве аргумента. Эта функция возвращает структуру кортежа, содержащую информацию о файле. Затем мы можем получить его свойство st_size, чтобы получить размер файла в байтах.
Вот простая программа для печати размера файла в байтах и мегабайтах.
# get file size in python import os file_name = "/Users/pankaj/abcdef.txt" file_stats = os.stat(file_name) print(file_stats) print(f'File Size in Bytes is ') print(f'File Size in MegaBytes is ')

Если вы посмотрите на функцию stat(), мы можем передать еще два аргумента: dir_fd и follow_symlinks. Однако они не реализованы для Mac OS.
Вот обновленная программа, в которой я пытаюсь использовать относительный путь, но выдает NotImplementedError.
# get file size in python import os file_name = "abcdef.txt" relative_path = os.open("/Users/pankaj", os.O_RDONLY) file_stats = os.stat(file_name, dir_fd=relative_path)
Traceback (most recent call last): File "/Users/pankaj/. /get_file_size.py", line 7, in file_stats = os.stat(file_name, dir_fd=relative_path) NotImplementedError: dir_fd unavailable on this platform
Статья Определение типа файла по его сигнатуре с помощью Python
Вполне возможно, что при разработке приложений вам может понадобиться определение типа файла. И не всегда тип файла можно узнать по расширению. Если в ОС Linux это не составляет больших проблем, так как данная операционная система распознает тип файла не по расширению, а по содержимому, то вот в Windows отсутствие расширения иногда вызывает множество вопросов. Давайте попробуем понять, как можно определить тип файла с помощью Python.
К сожалению, в Python встроенного модуля для определения типа файлов нет. Но есть модули сторонних разработчиков. Да, в стандартной поставке есть mimetypes, однако распознавать содержимое файла без расширения он не умеет.
Из сторонних модулей можно выделить magic. С ее помощью довольно точно можно узнать mime-тип файла. Вот только работа данного модуля завязана на библиотеку libmagic1. То есть, по сути это просто оболочка вокруг данной библиотеки. И для работы модуля требуется ее наличие. И если в Linux зачастую она установлена по умолчанию, то вот в Windows понадобиться установить библиотеки DLL. Давайте чуть подробнее рассмотрим, что нужно для того, чтобы работать с данным модулем, его установку и требования.
Что понадобиться?
Для начала необходимо установить сам модуль. Поэтому пишем в терминале команду:
pip install python-magic
В принципе, если вы работаете в Linux, установки библиотеки libmagic1 может и не понадобиться. К примеру, в Linux Mint данная библиотека установлена «из коробки». Однако, если, все же, у вас ее нет, то установка библиотеки в Ubuntu/Debian делается командой:
sudo apt-get install libmagic1
Если вы работаете в операционной системе Windows, то нужно установить DLL с помощью команды:
pip install python-magic-bin
В принципе, на этом все. Для работы модуля больше ничего особо не требуется.
Определение mime-типа файла с помощью magic
Давайте напишем маленький скрипт, для примера, чтобы понять, как работает данная библиотека.
Импортируем в скрипт нужные модули:
from pathlib import Path import magic
Теперь напишем небольшую функцию из одной строки, которая будет принимать путь к файлу и просто печатать его mime-тип.
def mime_magic(path): print(magic.Magic(mime=True).from_file(path))
И теперь, в функции main, вызовем данную функцию и передадим в нее путь к файлу.
def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") mime_magic(path) if __name__ == "__main__": main()
Скрипт в сборе
from pathlib import Path import magic def mime_magic(path): print(magic.Magic(mime=True).from_file(path)) def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") mime_magic(path) if __name__ == "__main__": main()
Я специально удалил расширение у файла и передал в функцию путь к нему. И вот, что я получил на выходе:
Однако, как я уже писал ранее, данный модуль — это только обертка python над библиотекой libmagic1. И здесь, если вы пишите переносимое приложение, придется тащить за собой все остальные зависимости. Проверять, установлена ли библиотека или, в случае с Windows устанавливать библиотеки DLL.
Но, есть еще один, более «хардкорный» путь. Ничего нового в нем нет, но он требует получения сигнатуры файла и сравнения со списком или словарем сигнатур для получения типа файла.
Определение типа файла по его сигнатуре
Понятие сигнатура файла известно так же как «магическое число». Это целочисленная или текстовая константа, с помощью которой можно однозначно идентифицировать ресурс или данные. Само по себе, это число не несет никакого смысла. Примером такого магического числа может служить исполняемый файл Windows с расширением .exe. Он начинается с последовательности байт 0x4D5A, и это само по себе символично, так как соответствует ASCII-символам MZ, которые являются инициалами Марка Збиковски являющегося одним из создателей MS-DOS.
В Linux, как я уже писал выше, тип файла определяется по его содержимому, точнее, по его сигнатуре, вне зависимости от его расширения и названия. Для того, чтобы интерпретировать сигнатуру файла можно использовать стандартную утилиту file.
Как же можно использовать это в скрипте python? Для примера я составил небольшой словарик сигнатур файлов. Конечно же, это только очень маленькая часть от огромного количества самых разнообразных сигнатур. Однако, это уже позволяет определить тип некоторых мультимедийных форматов файлов. Данные сигнатуры были взяты из статьи Википедии по этому
Ссылка скрыта от гостей
. Давайте от теории перейдем к практике.
Для начала импортируем нужные модули в наш скрипт. Здесь нам понадобятся два стандартных модуля: sys и Path из библиотеки pathlib.
import sys from pathlib import Path
Теперь инициализируем словарь с сигнатурами. Конечно же, если бы это был более масштабный проект, имело бы смысл вынести данные сигнатуры в отдельный модуль или json-файл. Но, так как, это лишь пример того, как определить сигнатуру, словарь маленький, а потому выносить его в отдельный модуль не имеет смысла.
signature =
Напишем небольшую функцию, в которой и будет происходить основное действие. Я назвал ее read_file(path). На входе она получает путь к файлу, тип которого требуется определить. А на выходе мы получаем тип файла или сообщение о невозможности определить сигнатуру.
Откроем файл на чтение в байтовом режиме. Считаем первые 256 байт. Этого вполне достаточно для того, чтобы определить тип файла. Переведем полученные данные в шестнадцатеричный вид.
with open(path, 'rb') as f: file = f.read(256) hex_bytes = " ".join([''.format(byte) for byte in file])
Запустим цикл для итерации по словарю сигнатур. В данном цикле запустим еще один цикл для итерации по полученной сигнатуре с определенным смещением. Сигнатуры типов файлов, которые представлены в моем словаре имею либо нулевое, либо смещение 4 байта. С учетом пробелов, это будет 12 символов. И дальше сравниваем сигнатуру из словаря с текущим куском байт, со смещением имеющим длину текущей сигнатуры. Если сигнатура найдена, возвращаем сообщение с именем файла и его типом. Если же сигнатура не найдена — возвращаем сообщение о неизвестной сигнатуре.
for hex_ch in signature: for i in [0, 12]: if hex_ch == str(hex_bytes[i:len(hex_ch) + i]): return f'Файл: "" имеет сигнатуру: "" файла' continue return "Неизвестная сигнатура"
Ну и функция main, в которой получаем путь к файлу и вызываем функцию read_file, в которую передаем полученный путь предварительно проверенный на существование.
def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") sys.exit(0) print(read_file(path)) if __name__ == "__main__": main()
Полный код скрипта
import sys from pathlib import Path signature = < "66 74 79 70 33 67": "3gp, 3gp2", "FF D8 FF E0": "jpg", "49 46 00 01": "jpeg", "89 50 4E 47 0D 0A 1A 0A": "png", "25 50 44 46 2D": "pdf", "4F 67 67 53": "ogg, oga, ogv", "52 49 46 46": "wav", "57 41 56 45": "wav", "41 56 49 20": "avi", "FF FB": "mp3", "FF F3": "mp3", "FF F2": "mp3", "49 44 33": "mp3", "66 4C 61 43": "flac", "1A 45 DF A3": "mkv, mka, mks, mk3d, webm", "47": "ts, tsv, tsa", "00 00 01 BA": "mpg, mpeg", "00 00 01 B3": "mpg, mpeg", "66 74 79 70 4D 53 4E 56": "mp4", "66 74 79 70 69 73 6F 6D": "mp4", "66 74 79 70 6D 70 34 32": "m4v" >def read_file(path: str) -> str: """ Получение сигнатуры файла. Итерация по словарю сигнатур и сравнение их с полученной сигнатурой в соответствии со смещением. :param path: Путь к файлу. :return: Строка, тип файла или сообщение о неизвестной сигнатуре. """ with open(path, 'rb') as f: file = f.read(256) hex_bytes = " ".join([''.format(byte) for byte in file]) for hex_ch in signature: for i in [0, 12]: if hex_ch == str(hex_bytes[i:len(hex_ch) + i]): return f'Файл: "" имеет сигнатуру: "" файла' continue return "Неизвестная сигнатура" def main(): path = input("Введите путь к файлу: ") if not Path(path).exists(): print("Файла не существует!") sys.exit(0) print(read_file(path)) if __name__ == "__main__": main()
Для теста я выбрал файл mp3 без расширения и файл mp4 скачанный с YouTube. И вот что у меня получилось:
Как видно из вышеприведенных примеров, определение файла по его сигнатуре работает успешно. Однако, для использования в серьезных проектах, думаю, что словарь со списком сигнатур следует несколько видоизменить и добавить группу сигнатур, которая будет определятся смещением, чтобы при итерации считывать смещение из самого словаря.
А на этом пожалуй все.
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна