Какое расширение имеет файл, созданный в Python

Обновлено: 21.11.2024

Поиск сторонних пакетов можно найти в индексе пакетов Python или воспользоваться Google или другой поисковой системой. Поиск по слову «Python» и по одному-двум ключевым словам, относящимся к интересующей вас теме, обычно помогает найти что-то полезное.

Где находится исходный файл math.py (socket.py, regex.py и т. д.)?¶

Если вы не можете найти исходный файл для модуля, это может быть встроенный или динамически загружаемый модуль, реализованный на C, C++ или другом скомпилированном языке. В этом случае у вас может не быть исходного файла или это может быть что-то вроде mathmodule.c , где-то в исходном каталоге C (не на пути Python).

В Python есть (как минимум) три вида модулей:

модули, написанные на Python (.py);

модули, написанные на C и загружаемые динамически (.dll, .pyd, .so, .sl и т. д.);

модули, написанные на C и связанные с интерпретатором; чтобы получить их список, введите:

Как сделать скрипт Python исполняемым в Unix?¶

Во-первых, выполняется команда chmod +x scriptfile или, возможно, chmod 755 scriptfile .

Второе можно сделать несколькими способами. Самый простой способ — написать

в самой первой строке вашего файла, используя путь к месту установки интерпретатора Python на вашей платформе.

Если вы хотите, чтобы сценарий не зависел от того, где находится интерпретатор Python, вы можете использовать программу env. Почти все варианты Unix поддерживают следующее, предполагая, что интерпретатор Python находится в каталоге пользователя PATH:

Не делайте этого для скриптов CGI. Переменная PATH для сценариев CGI часто очень минимальна, поэтому вам необходимо использовать фактический абсолютный путь к интерпретатору.

Иногда среда пользователя настолько заполнена, что программа /usr/bin/env дает сбой; или вообще нет программы env. В этом случае вы можете попробовать следующий лайфхак (автор Alex Rezinsky):

Небольшой недостаток заключается в том, что это определяет строку __doc__ скрипта. Однако это можно исправить, добавив

Есть ли пакет curses/termcap для Python?¶

Для вариантов Unix: стандартный исходный код Python поставляется с модулем curses в подкаталоге Modules, хотя по умолчанию он не скомпилирован. (Обратите внимание, что это недоступно в дистрибутиве Windows — для Windows нет модуля curses.)

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

Есть ли аналог функции onexit() в C в Python?¶

Модуль atexit предоставляет функцию регистрации, аналогичную функции onexit() языка C.

Почему мои обработчики сигналов не работают?¶

Самая распространенная проблема заключается в том, что обработчик сигнала объявлен с неверным списком аргументов. Это называется

поэтому он должен быть объявлен с двумя параметрами:

Обычные задачи¶

Как протестировать программу или компонент Python?¶

Python поставляется с двумя средами тестирования. Модуль doctest находит примеры в строках документации для модуля и запускает их, сравнивая вывод с ожидаемым выводом, указанным в строке документации.

Модуль unittest представляет собой более сложную среду тестирования, основанную на средах тестирования Java и Smalltalk.

Чтобы упростить тестирование, вы должны использовать в своей программе хороший модульный дизайн. Ваша программа должна иметь почти всю функциональность, инкапсулированную либо в функции, либо в методы класса — и это иногда имеет удивительный и восхитительный эффект ускорения работы программы (поскольку доступ к локальным переменным выполняется быстрее, чем доступ к глобальным). Кроме того, программа должна избегать зависимости от изменения глобальных переменных, так как это значительно усложняет тестирование.

«Глобальная основная логика» вашей программы может быть такой же простой, как

в нижней части основного модуля вашей программы.

После того как ваша программа будет организована как удобный набор функций и поведений классов, вы должны написать тестовые функции, которые проверяют поведение. Набор тестов, который автоматизирует последовательность тестов, может быть связан с каждым модулем. Это звучит как много работы, но, поскольку Python такой лаконичный и гибкий, это на удивление просто. Вы можете сделать программирование намного более приятным и увлекательным, написав свои тестовые функции параллельно с «рабочим кодом», так как это позволяет легко находить ошибки и даже конструктивные недостатки раньше.

«Модули поддержки», которые не предназначены для использования в качестве основного модуля программы, могут включать самопроверку модуля.

Даже программы, которые взаимодействуют со сложными внешними интерфейсами, могут быть протестированы, когда внешние интерфейсы недоступны, с использованием «фальшивых» интерфейсов, реализованных в Python.

Как создать документацию из строк документа?¶

Модуль pydoc может создавать HTML из строк документации в исходном коде Python. Альтернативой для создания документации API исключительно из строк документации является epydoc. Sphinx также может включать содержимое строки документации.

Как получить одно нажатие клавиши за раз?¶

Для вариантов Unix существует несколько решений. Это легко сделать с помощью curses, но curses — довольно большой модуль для изучения.

Потоки¶

Как программировать с использованием потоков?¶

Обязательно используйте модуль threading, а не модуль _thread. Модуль threading создает удобные абстракции поверх низкоуровневых примитивов, предоставляемых модулем _thread.

Похоже, ни одна из моих тем не запущена: почему?¶

Как только основной поток завершается, все потоки уничтожаются. Ваш основной поток работает слишком быстро, и потоки не успевают выполнить какую-либо работу.

Простое решение – добавить в конец программы паузу, достаточную для завершения всех потоков:

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

Простое исправление заключается в добавлении крошечного сна к началу функции запуска:

Вместо того, чтобы пытаться угадать хорошее значение задержки для time.sleep() , лучше использовать какой-то семафорный механизм. Одна из идей состоит в том, чтобы использовать модуль очереди для создания объекта очереди, позволить каждому потоку добавлять маркер в очередь после завершения и позволить основному потоку считывать столько маркеров из очереди, сколько существует потоков.

Как распределить работу между несколькими рабочими потоками?¶

Проще всего использовать модуль concurrent.futures, особенно класс ThreadPoolExecutor.

Или, если вам нужен точный контроль над алгоритмом диспетчеризации, вы можете вручную написать собственную логику. Используйте модуль очереди, чтобы создать очередь, содержащую список заданий. Класс Queue поддерживает список объектов и имеет метод .put(obj), который добавляет элементы в очередь, и метод .get() для их возврата. Класс позаботится о блокировке, необходимой для того, чтобы каждое задание выдавалось ровно один раз.

Вот банальный пример:

При запуске будет получен следующий результат:

Для получения дополнительной информации см. документацию модуля; класс Queue предоставляет многофункциональный интерфейс.

Какие глобальные мутации значений являются потокобезопасными?¶

Глобальная блокировка интерпретатора (GIL) используется внутри, чтобы гарантировать, что в каждый момент времени на виртуальной машине Python выполняется только один поток. В общем, Python предлагает переключаться между потоками только между инструкциями байт-кода; как часто он переключается, можно установить с помощью sys.setswitchinterval() . Таким образом, каждая инструкция байт-кода и, следовательно, весь код реализации C, полученный из каждой инструкции, является атомарным с точки зрения программы Python.

Теоретически это означает, что для точного учета требуется точное понимание реализации байт-кода PVM. На практике это означает, что операции с общими переменными встроенных типов данных (целые числа, списки, словари и т. д.), которые «выглядят атомарными», на самом деле являются атомарными.

Например, все следующие операции являются атомарными (L, L1, L2 — списки, D, D1, D2 — словари, x, y — объекты, i, j — целые числа):

Операции, которые заменяют другие объекты, могут вызывать метод __del__() этих других объектов, когда их счетчик ссылок достигает нуля, и это может повлиять на ситуацию. Особенно это касается массовых обновлений словарей и списков. Если сомневаетесь, используйте мьютекс!

Можем ли мы избавиться от глобальной блокировки интерпретатора?¶

Глобальная блокировка интерпретатора (GIL) часто рассматривается как препятствие для развертывания Python на высокопроизводительных многопроцессорных серверах, поскольку многопоточная программа Python эффективно использует только один ЦП из-за того, что (почти) все Python код может выполняться только при удерживаемом GIL.

Ещё во времена Python 1.5 Грег Штейн реализовал комплексный набор исправлений (исправления для «бесплатных потоков»), которые удалили GIL и заменили его мелкозернистой блокировкой. Адам Олсен недавно провел аналогичный эксперимент в своем проекте python-safethread. К сожалению, оба эксперимента продемонстрировали резкое падение однопоточной производительности (как минимум на 30 % медленнее) из-за количества мелких блокировок, необходимых для компенсации удаления GIL.

Это не означает, что вы не можете эффективно использовать Python на многопроцессорных машинах! Вам просто нужно проявить изобретательность, разделив работу между несколькими процессами, а не несколькими потоками. Класс ProcessPoolExecutor в новом модуле concurrent.futures обеспечивает простой способ сделать это; модуль multiprocessing предоставляет низкоуровневый API на тот случай, если вам нужен больший контроль над диспетчеризацией задач.

Разумное использование расширений C также поможет; если вы используете расширение C для выполнения трудоемкой задачи, расширение может освободить GIL, пока поток выполнения находится в коде C, и позволить другим потокам выполнить некоторую работу. Некоторые стандартные библиотечные модули, такие как zlib и hashlib, уже делают это.

Было предложено, чтобы GIL был блокировкой состояния каждого интерпретатора, а не действительно глобальной; тогда интерпретаторы не смогут совместно использовать объекты. К сожалению, это тоже вряд ли произойдет. Это потребовало бы огромного объема работы, потому что многие реализации объектов в настоящее время имеют глобальное состояние. Например, кэшируются небольшие целые числа и короткие строки; эти кэши должны быть переведены в состояние интерпретатора. Другие типы объектов имеют свой собственный список свободных мест; эти свободные списки должны быть перемещены в состояние интерпретатора. И так далее.

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

И, наконец, если у вас есть несколько интерпретаторов, не имеющих общего состояния, что вы получите от запуска каждого интерпретатора в отдельном процессе?

Ввод и вывод¶

Как удалить файл? (И другие вопросы о файлах…)¶

Используйте os.remove(имя файла) или os.unlink(имя файла); документацию см. в модуле os. Эти две функции идентичны; unlink() — это просто имя системного вызова Unix для этой функции.

Чтобы удалить каталог, используйте os.rmdir() ; используйте os.mkdir() для его создания. os.makedirs(path) создаст все несуществующие промежуточные каталоги в пути. os.removedirs(path) удалит промежуточные каталоги, пока они пусты; если вы хотите удалить все дерево каталогов и его содержимое, используйте Shutil.rmtree() .

Чтобы переименовать файл, используйте os.rename(old_path, new_path) .

Чтобы обрезать файл, откройте его с помощью f = open(filename, "rb+") и используйте f.truncate(offset) ; offset по умолчанию соответствует текущей позиции поиска. Существует также os.ftruncate(fd, offset) для файлов, открытых с помощью os.open() , где fd — дескриптор файла (небольшое целое число).

Модуль Shutil также содержит ряд функций для работы с файлами, включая copyfile() , copytree() и rmtree() .

Как скопировать файл?¶

Модуль Shutil содержит функцию copyfile(). Обратите внимание, что в MacOS 9 не копируются ветки ресурсов и информация Finder.

Как читать (или записывать) двоичные данные?¶

Для чтения или записи сложных форматов двоичных данных лучше всего использовать модуль struct. Он позволяет вам взять строку, содержащую двоичные данные (обычно числа), и преобразовать ее в объекты Python; и наоборот.

Например, следующий код считывает из файла два 2-байтовых целых числа и одно 4-байтовое целое в формате с прямым порядком байтов:

Знак «>» в ​​строке формата приводит к использованию данных с обратным порядком байтов; буква «h» считывает одно «короткое целое» (2 байта), а «l» читает одно «длинное целое» (4 байта) из строки.

Мы можем использовать функцию splitext() модуля ОС Python, чтобы получить расширение файла. Эта функция разбивает путь к файлу на кортеж, имеющий два значения — корень и расширение.

Получение расширения файла в Python

Вот простая программа для получения расширения файла в Python.

Вывод:

Расширение файла в Python

  • В первом примере мы напрямую распаковываем значения кортежа в две переменные.
  • Обратите внимание, что файл .bashrc не имеет расширения. Точка добавляется к имени файла, чтобы сделать его скрытым.
  • В третьем примере в имени каталога есть точка.

Получить расширение файла с помощью модуля Pathlib

Мы также можем использовать модуль pathlib для получения расширения файла. Этот модуль появился в версии Python 3.4.

Заключение

Для получения расширения файла всегда лучше использовать стандартные методы. Если вы уже используете модуль os, используйте метод splitext(). Для объектно-ориентированного подхода используйте модуль pathlib.

Как получить размер файла в Python

Как читать из стандартного ввода в Python

Мне нравятся технологии с открытым исходным кодом, и я люблю писать о своем опыте работы с ними.

JournalDev — один из самых популярных веб-сайтов, посвященных Java, Python, Android и связанным с ними техническим статьям. Наши учебники регулярно обновляются, не содержат ошибок и полны. Каждый месяц миллионы таких же разработчиков, как и вы, посещают JournalDev, чтобы прочитать наши руководства.

JournalDev был основан Панкаджем Кумаром в 2010 году, чтобы поделиться своим опытом и знаниями со всем миром. Ему нравятся технологии с открытым исходным кодом, и писать в JournalDev стало его страстью.

Самые популярные

Избранные сайты

© 2021 · Политика конфиденциальности · Условия использования · Свяжитесь с нами · О нас · Часть JournalDev IT Services Private Limited

В этом руководстве рассказывается, как получить расширение файла из имени файла в Python.

Используйте модуль os.path для извлечения расширения из файла в Python

В Python есть модуль os.path, в котором есть готовые полезные служебные функции для управления путями к файлам ОС. Он включает в себя открытие, сохранение и обновление, а также получение информации из путей к файлам.

Мы будем использовать этот модуль для получения расширения файла в Python.

os.path имеет функцию splitext() для разделения корня и расширения заданного пути к файлу. Функция возвращает кортеж, содержащий корневую строку и строку расширения.

Давайте укажем пример пути к файлу с расширением docx.

Ожидаемый вывод должен иметь расширение .docx .

Объявите две отдельные переменные, чтобы получить результат splitext() с именами extension и root .

Теперь расширение успешно возвращено из корневого пути к файлу.

Использование модуля pathlib для извлечения расширения из файла в Python

pathlib — это модуль Python, который содержит классы, представляющие пути к файлам, и реализует служебные функции и константы для этих классов.

pathlib.Path() принимает строку пути в качестве аргумента и возвращает новый объект Path.

Объект pathlib.Path имеет суффикс атрибута, который возвращает информацию о расширении файла.

Помимо корня, мы также можем получить путь к родительскому файлу и фактическое имя файла заданного пути к файлу, просто вызвав атрибуты parent и name в объекте Path.

Что, если у нас есть расширение файла, такое как .tar.gz или .tar.bz2?

pathlib также предоставляет атрибут для файлов с несколькими суффиксами в качестве расширений. Суффиксы атрибутов в объекте Path представляют собой список, содержащий все суффиксы данного файла. Если мы воспользуемся приведенным выше примером и распечатаем атрибут суффиксов:

Поэтому, даже если есть только один суффикс, на выходе будет одноэлементный список.

Теперь попробуйте пример с расширением .tar.gz. Чтобы преобразовать список в одну строку, можно использовать функцию join() для пустой строки и принимать атрибут suffixes в качестве аргумента.

Теперь вместо списка отображается фактическое расширение.

Подводя итог, два модуля os и pathlib предоставляют удобные методы для получения расширения файла из пути к файлу в Python.

Модуль os имеет функцию splitext для отделения корня и имени файла от расширения файла. pathlib создает объект Path и просто сохраняет расширение в суффиксах атрибутов.

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

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».

Статья по теме — файл Python

сообщить об этом объявлении

В этом руководстве вы узнаете, как использовать Python для получения расширения файла. Вы сделаете это, используя как библиотеку pathlib, так и модуль os.path.

Умение легко работать с файлами в Python – одно из самых сильных сторон языка. Например, вы можете использовать библиотеку glob для перебора файлов в папке. Когда вы делаете это, знание расширения каждого файла может повлиять на дальнейшие решения. Из-за этого знание того, как получить расширение файла, является навыком импорта! Давайте начнем изучать, как использовать Python для получения расширения файла в Windows, Mac и Linux!

Быстрый ответ: используйте Pathlib

Оглавление

Использование Python Pathlib для получения расширения файла

Библиотека Python pathlib невероятно упрощает работу с путями и управление ими. Из-за этого вполне логично, что у библиотеки есть способ доступа к расширению файла.

Библиотека pathlib поставляется с классом Path , который мы используем для создания объектов на основе путей. Когда мы загружаем путь к нашему файлу в объект Path, мы можем получить доступ к определенным атрибутам объекта, используя его встроенные свойства.

Давайте посмотрим, как мы можем использовать библиотеку pathlib в Python для получения расширения файла:

Здесь мы видим, что мы передали путь к файлу в класс Path, создав объект Path. После того, как мы это сделали, мы можем получить доступ к различным атрибутам, включая атрибут .suffix. Когда мы присвоили это переменной с именем extension , мы распечатали его, получив обратно .xlsx.

Этот метод хорошо работает как на компьютерах Mac, так и на Linux. Однако при работе с Windows пути к файлам работают немного по-другому.

По этой причине при использовании Windows создавайте путь к файлу в виде «сырой» строки. Но как это сделать? Просто добавьте к строке префикс r, например, r'some string'. Это позволит Python узнать, что нельзя использовать обратную косую черту в качестве escape-символов.

Теперь, когда мы рассмотрели, как использовать pathlib в Python для получения расширения файла, давайте посмотрим, как мы можем сделать то же самое с помощью модуля os.path.

Хотите узнать больше? Хотите узнать, как использовать библиотеку pathlib для автоматического переименования файлов в Python? Посмотрите мой подробный учебник и видео о науке о данных!

Использование os.path в Python для получения расширения файла

Модуль os.path позволяет нам легко работать с нашей операционной системой! Модуль пути позволяет нам использовать пути к файлам по-разному, в том числе позволяя нам получить расширение файла.

Модуль os.path имеет полезную функцию splitext() , которая позволяет нам разбивать пути к файлам на отдельные компоненты. К счастью, splitext() — это умная функция, которая умеет отделять расширения файлов, а не просто разбивать строку.

Давайте посмотрим, как мы можем использовать функцию splitext() для получения расширения файла:

  1. Мы импортируем os.path . Вместо записи из пути импорта ОС мы используем эту форму импорта, чтобы оставить путь переменной открытым и чистым.
  2. Мы загружаем нашу переменную file_path. Помните: если вы работаете в Windows, сделайте путь к файлу необработанной строкой, предварительно зафиксировав букву r перед открывающей кавычкой.
  3. Примените функцию splitext() к пути к файлу. Затем мы получаем доступ к последнему элементу элемента.

Функция splitext() возвращает кортеж: первая часть будет именем файла, а вторая — его расширением. Из-за этого, если нам нужно только расширение файла, мы можем просто получить доступ к последнему элементу кортежа.

Как использовать расширение файла Python

Теперь, когда вы узнали два разных способа использования Python для получения расширения файла, как вы можете применить это?

Один из удобных способов — воздействовать, скажем, только на файлы Excel. Если вы пишете цикл for, вы можете сначала проверить, является ли файл файлом Excel, а затем загрузить его в фрейм данных Pandas. Такой подход позволит вам пропустить файлы, которые на самом деле могут не содержать никаких данных.

Давайте посмотрим, как это сделать в Python и Pandas:

Заключение

В этом посте вы узнали, как использовать Python для получения расширения файла. Вы узнали, как это сделать, используя как библиотеку pathlib, так и модуль os.path, используя функцию splitext(). Вы научились делать это в Windows, Mac и Linux, чтобы ваш код мог работать в разных системах.

Чтобы узнать больше о функции splitext(), ознакомьтесь с официальной документацией здесь.

Читайте также: