Python изменить расширение файла
Есть ли встроенная функция в Python, которая заменит (или удалит, что угодно) расширение имени файла (если оно есть)?
В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg
Я не знаю, имеет ли это значение, но мне нужно это для модуля SCons, который я пишу. (Может быть, есть какая-то специальная функция SCons, которую я могу использовать?)
Мне нужно что-то очистить. Выполнение простой замены строк всех вхождений .txt внутри строки, очевидно, не является чистым. (Это не удастся, если мое имя файла somefile.txt.txt.txt )
SCons позволяет получить доступ к базе файлов в строке действия. Можете ли вы опубликовать свою логику конкретной логике, которая нуждается в этом? Это для действия, излучателя, сканера?
Попробуйте os.path.splitext, он должен делать то, что вы хотите.
@ereOn: Кроме того, в будущем, попробуйте сначала ПОИСК. Это лучше работает для ответа на такие стандартные вопросы.
@S.Lott:S.Lott: Верьте мне или нет. Но я сделал. Я всегда делаю. Возможно, с неправильными условиями.
@ereOn: Поскольку в вашем вопросе используется почти та же фраза, я немного удивлен, что вы его не нашли. Ваш вопрос состоит из 5 слов подряд, которые точно соответствуют.
@Tony Veijalainen: Вы не должны использовать os.path.join, потому что это для соединения компонентов пути с разделителем пути, зависящим от ОС. Например, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg') вернет /home/user/somefile/.jpg , который не желательно
@S.LottS.Lott - 99 человек проголосовали за этот ответ довольно ясно, значит, этот пост полезен, не нужно стыдить всех
Как сказал @jethro, splitext - это аккуратный способ сделать это. Но в этом случае довольно легко разбить его самостоятельно, поскольку расширение должно быть частью имени файла, следующего за последним периодом:
rsplit сообщает Python выполнять строковые разделения, начиная с правой части строки, а 1 говорит, чтобы выполнить не более одного разделения (так, например, 'foo.bar.baz' → [ 'foo.bar', 'baz' ] ). Поскольку rsplit всегда возвращает непустой массив, мы можем безопасно индексировать 0 в него, чтобы получить имя файла за вычетом расширения.
Обратите внимание, что использование rsplit приведет к различным результатам для файлов, которые начинаются с точки и не имеют другого расширения (например, скрытые файлы в Linux, например, .bashrc ). os.path.splitext возвращает пустое расширение для них, но использование rsplit будет рассматривать все имя файла как расширение.
Расширение ответа AnaPana, как удалить расширение с помощью pathlib (Python >= 3.4):
Бывает такой заходишь на почту и видишь очередную подборку статей, которые никогда не прочитаешь, но тут так сошлись звезды, что и открыл статью, и прочел, и придумал, где на практике пригодится. А теперь хочу поделиться статьей с Хабром, чтобы если кому-то нужен будет простой и понятный гайд по работе с изображениями на Python — пожалуйста.
Pillow — это свободно распространяемая библиотека для работы с изображениями (далее Imaging Library) на Python с открытым исходным кодом, которая добавляет вашему коду поддержку открытия, изменения и сохранения изображений в различных расширениях.
Давайте начнем
Самый важный класс в Imaging Library Python — это класс Image, определенный в одноименном модуле. Мы используем open(), чтобы открыть изображение в нашей локальной директории, как показано ниже:
Это просто! Теперь вы умеете считывать изображения с помощью Pillow, а значит можно приступать к обработке изображения с его помощью. Вы также можете проверить тип изображения, которое мы только что загрузили.
Вы можете посмотреть свойства изображения, например:
Кроме того, вы можете вывести на экран изображение, используя метод show
Конвертирование расширения изображения
Когда вы закончите работать с изображением при помощи библиотеки Pillow в изначальном расширении, вы можете пересохранить его в других форматах, например, их jpg сделать png или многие другие.
Для примера, давайте попробуем написать простую программу на Python для преобразования всех изображений в каталоге вашего проекта, которые находятся в формате jpg, в формат png.
После того, как вы запустите приведенный выше код, в каталоге проекта, состоящем из изображений в формате jpg, откроются все изображения и преобразуются в .jpg, как показано на скриншоте. Вы можете повторить тот же процесс для преобразования изображений в другие преобразований.
Обрезка изображения
Pillow также может использоваться для обрезки изображения, при этом вы можете получить производный прямоугольник выбранного изображения, указав координаты, по которым преобразовать изображение.
Как мы видим, изображение было успешно обрезано. Координаты обрезанной поверхности представлены диагональными координатами.
При этом первые две точки находятся (x, y) от верхней левой диагональной точки, а следующие две точки (x2, y2) также являются диагональной точкой снизу справа.
Геометрическое преобразование
С помощью Pillow мы можем выполнять некоторые геометрические преобразования над изображением, включая изменение размера и поворот изображения.
Эти знания играют большую роль при генерации данных для глубокого обучения путем преобразования одного изображения в тонны других изображений с разных ракурсов.
Изменение размера изображения
Когда вы запустите приведенный выше код, вы должны увидеть новое изображение с измененным размером в вашем каталоге с размером 320 на 320.
Поворот изображения
Используйте функцию вращения для создания 360 изображений одного из того же изображения под разными углами — это поможет сгенерировать данные, которые вы потенциально можете использовать для обучения своей модели глубокого обучения.
Генератор изображений
После запуска скрипта, вы должны увидеть 360 изображений одного и того же исходного изображения с разным поворотом, как показано ниже.
Фильтрация изображений
Фильтрация — это метод изменения или улучшения изображения. Например, вы можете отфильтровать изображение, чтобы выделить определенные особенности или удалить другие.
Фильтрация изображений используется для получения различных результатов, как, например,- сглаживание, повышение резкости, удаление шума и обнаружение краев.
В библиотеке Pillow доступно множество фильтров, включая BLUR, BoxBlur, CONTOUR, FIND_EDGES, Filter, GaussianBlur, Kernel, MaxFilter, MedianFilter, SHARPEN, SMOOTH и т.д.
Пример использования
Давайте попробуем найти края на изображении ниже, используя фильтр FIND_EDGES.
Таким же образом вы можете экспериментировать с другими фильтрами в Python библиотеке Pillow в зависимости от того, что вы пытаетесь сделать.
Чтение изображения из открытого файла
Кроме того, вы можете использовать Pillow для чтения изображения из файлового объекта Python, как показано ниже
Чтение изображения из URL
В этом случае вам придется использовать Pillow в сочетании с запросами. Запросы должны будут отправлять GET-request на сервер, чтобы получить необработанные байты изображения, а уже Pillow считает эти байты.
Создание новых изображений
С помощью Pillow вы также можете создать новое пустое изображение, которое может понадобиться для различных целей. Используйте Image.new() для создания совершенно нового изображения.
Синтаксис:
Пример использования:
Рисование прямоугольников на изображениях
Pillow также может использоваться для рисования прямоугольника на изображениях. Обычно это делают при обнаружении объекта. При этом вы можете нарисовать не просто прямоугольник, а рамку над обнаруженным объектом.
Пример исползования
Давайте попробуем нарисовать прямоугольную рамку внутри пустого изображения.
Первые две координаты представляют (x, y) левой верхней части, а следующие две (x2, y2) представляют координатную точку правой нижней части.
Рисование текста на изображениях
Мы также можем использовать библиотеку Pillow для рисования текста на изображениях.
Python понимает все популярные форматы файлов. Кроме того, у каждой библиотеки есть свой, «теплый ламповый», формат. Синтаксис, разумеется, у каждого формата сугубо индивидуален. Я собрал все функции для работы с файлами разных форматов на один лист A4, с приложением в виде примера использования в jupyter notebook.
Я условно разделил форматы на три блока по способу использования. Как известно, файлы нужны для обмена информацией: между людьми, между программами (первый блок), между компьютером и сетью (второй) и «save game» – между одной и той же программой в разные моменты времени (третий блок).
Вкратце о каждом блоке:
1) Универсальные форматы:
- .csv – текстовый, значения, разделённые по идее запятыми (comma separated), но например, русский эксель предпочитает разделять точками с запятыми, поскольку в русской локали запятая уже используется – в качестве десятичного разделителя;
- .raw – бинарный формат для тех, кто не любит форматы файлов. Тип данных и, если данные многомерные, соответствующие размеры должны передаваться отдельно, в файле только сами данные;
- .xls/.xlsx – старый бинарный (ограничение в 65k строк) и новый xml’ный форматы экселя;
- .mat – это на самом деле тоже два формата (оба бинарные): старый проприетарный и новый на основе hdf5. Питон умеет работать с обоими (через библиотеки).
- .json – текстовый, выглядит как словарь в питоне, но кавычки можно использовать только двойные;
- .xml – текстовый, похож на html.
- .pkl – бинарный формат, в него умеют сохраняться все встроенные питоновские объекты. Пользовательские классы тоже умеют, а если питон сохраняет как-то не так, можно ему помочь через магические методы. Поддерживает дописывание в конец существующего файла (appending).
- .npy и .npz – в numpy аж целых два своих формата (оба бинарные). Появились как реакция на потерю обратной совместимости у pkl в момент перехода python v2->v3. Накладные расходы минимальные (~ на 100 байт больше, чем соответствующий raw; pkl, впрочем, немногим больше: на ~150 байт больше raw). В .npy можно сохранить только один массив, а в npz – сразу несколько, причём достать их оттуда впоследствии можно по имени.
- .h5 – бинарный формат hdf5. Примечателен тем, что в нем можно хранить целую иерархическую структуру данных, это практически файловая система в одном файле. Кроме того, его можно открыть в matlab без конвертации. Минусы:
a) небольшие файлы занимают неоправданно много места (например, 300 байт pkl vs 3.1 Мb у h5),
b) много багов,
c) есть дописывание в существующий файл, но если при этом случится ошибка (а так бывает), данные из него достать будет проблематично.
– в формате pdf
– в формате png:
Пример использования всех функций с диаграммы: html с оглавлением и ipynb-исходником
Есть ли в Python встроенная функция, которая могла бы заменить (или удалить что угодно) расширение имени файла (если оно есть)?
В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg
Не знаю, имеет ли это значение, но мне это нужно для модуля SCons, который я пишу. (Так, может быть, я могу использовать какую-то особую функцию SCons?)
Я хочу что-нибудь чистое . Совершенно .txt очевидно, что простая замена всех вхождений внутри строки не является чистой. (Это не сработает, если мое имя файла somefile.txt.txt.txt )
SCons позволяет получить файловую базу в строке действия. Можете ли вы опубликовать конкретную логику вашего бра, которая в этом нуждается? Это для экшена, эмиттера, сканера?
Попробуйте os.path.splitext, он должен делать то, что вы хотите.
@ereOn: Поскольку в вашем вопросе используется почти такая же формулировка, я немного удивлен, что вы не нашли его. Ваш вопрос состоит из 5 слов подряд, которые точно совпадают.
@Tony Veijalainen: Вы не должны использовать os.path.join, потому что он предназначен для объединения компонентов пути с разделителем пути для конкретной ОС. Например, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg') вернется /home/user/somefile/.jpg , что нежелательно.
@ S.Lott - 99 человек, проголосовавших за этот ответ, довольно явно означают, что этот пост полезен, не нужно
Расширяя ответ AnaPana, как удалить расширение с помощью pathlib (Python> = 3.4):
Это мой типичный подход, но, похоже, он не работает, когда у вас есть несколько расширений файлов. Например, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg')) выведет 'data/foo.tar.jpg' . Я полагаю, вы можете это сделать pth.with_suffix('').with_suffix('.jpg') , но это неуклюже, и вам нужно будет добавить произвольно длинную цепочку .with_suffix('') вызовов, чтобы иметь дело с произвольным количеством точек . в расширении файла (по общему признанию, более 2 - это экзотический крайний случай).
@tel Вы можете использовать while цикл, чтобы решить эту проблему: pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Есть ли в Python встроенная функция, которая заменяет (или удаляет что угодно) расширение имени файла (если оно есть)?
В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg
Не знаю, имеет ли это значение, но мне это нужно для модуля SCons, который я пишу. (Так что, возможно, я могу использовать какую-то особую функцию SCons?)
Я хочу что-нибудь чистое . Совершенно .txt очевидно, что простая замена всех вхождений внутри строки не является чистой. (Это не сработает, если мое имя файла somefile.txt.txt.txt )
SCons позволяет получить доступ к файловой базе в строке действия. Можете ли вы опубликовать конкретную логику вашего бра, которая в этом нуждается? Это для экшена, эмиттера, сканера?
Попробуйте os.path.splitext, он должен делать то, что вы хотите.
@ereOn: Поскольку в вашем вопросе используется почти такая же формулировка, я немного удивлен, что вы его не нашли. Ваш вопрос состоит из 5 слов подряд, которые точно совпадают.
@Tony Veijalainen: Вы не должны использовать os.path.join, потому что он предназначен для объединения компонентов пути с разделителем пути, зависящим от ОС. Например, print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg') вернется /home/user/somefile/.jpg , что нежелательно.
@ S.Lott - 99 человек, проголосовавших за этот ответ, довольно явно означает, что этот пост полезен, не нужно стыдить заглавными буквами
Расширяя ответ AnaPana, как удалить расширение с помощью pathlib (Python> = 3.4):
Этот ответ является моим типичным подходом, но, похоже, он не работает, когда у вас есть несколько расширений файлов. Например, pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg')) выведет 'data/foo.tar.jpg' . Я полагаю, вы можете это сделать pth.with_suffix('').with_suffix('.jpg') , но это неуклюже, и вам нужно будет добавить произвольно длинную цепочку .with_suffix('') вызовов, чтобы иметь дело с произвольным количеством точек . в расширении файла (по общему признанию, более 2 - это экзотический крайний случай).
@tel Вы можете использовать while цикл, чтобы решить эту проблему: pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Как сказал @jethro, splitext это аккуратный способ сделать это. Но в этом случае довольно легко разделить его самостоятельно, поскольку расширение должно быть частью имени файла, идущей после последней точки:
rsplit Говорит Python для выполнения строки расколов , начиная с правой части строки, и 1 говорит , что для выполнения более одного раскола (так что , например , 'foo.bar.baz' -> [ 'foo.bar', 'baz' ] ). Поскольку rsplit всегда будет возвращать непустой массив, мы можем безопасно индексировать 0 его, чтобы получить имя файла без расширения.
Обратите внимание, что использование rsplit приведет к разным результатам для файлов, которые начинаются с точки и не имеют другого расширения (например, скрытые файлы в Linux .bashrc ). os.path.splitext возвращает для них пустое расширение, но при использовании rsplit все имя файла рассматривается как расширение.
Я предпочитаю следующий однострочный подход с использованием str.rsplit () :
Читайте также: