Python как получить имя файла
Перейти к содержимому

Python как получить имя файла

  • автор:

Получение списка файлов в директории на Python

Всё чаще современные программисты предпочитают работать с языком программирования Python, потому что он очень гибкий, позволяющий легко взаимодействовать с операционной системой. Он также поставляется с функциями по работе с файловой системой. Решение задачи распечатки списка файлов в директории можно решить используя разные модули: os, subprocess, fnmatch и pathlib. Следующие решения демонстрируют, как успешно воспользоваться этими модулями.

Применение os.walk()

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

os.walk() возвращает список из трех элементов: имя корневого каталога, список имен вложенных папок и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.

import os for root, dirs, files in os.walk("."): for filename in files: print(filename) 

Использование командной строки, через subprocess

Модуль subprocess позволяет выполнить системную команду и собрать её результат. В нашем случае вызываемая системная команда выглядит следующим образом:

$ ls -p . | grep -v /$ 

Инструкция ls -p . распечатывает список файлов текущего каталога, добавляя разделитель / в конце имени каждого подкаталога, которые нам понадобится на следующем шаге. Вывод этого вызова передается команде grep, которая отфильтровывает данные по мере поступления. Параметры -v / $ исключают все имена записей, которые заканчиваются разделителем /. Фактически / $ — регулярное выражение, которое соответствует всем строкам, содержащим символ / самым последним символом в строке, который определяется символом $.

Модуль subprocess позволяет строить настоящие конвейеры, а также соединять входные и выходные потоки, как это делается в командной строке. Вызов метода subprocess.Popen() открывает соответствующий процесс и определяет два параметра stdin и stdout.

Первая переменная ls определяет процесс выполнения ls –p для захвата stdout в конвейере. Поэтому поток stdout определяется как subprocess.PIPE. Вторая переменная grep также определяется как процесс, но вместо этого выполняет инструкцию grep –v /$.

Чтобы прочитать вывод команды ls из конвейера, поток stdin grep присваиваивается в ls.stdout. В заключение, переменная endOfPipe считывает вывод команды grep из grep.stdout, затем распечатывается в stdout циклом for.

import subprocess # определение команды ls ls = subprocess.Popen(["ls", "-p", "."], stdout=subprocess.PIPE, ) # определение команды grep grep = subprocess.Popen(["grep", "-v", "/$"], stdin=ls.stdout, stdout=subprocess.PIPE, ) # чтение из данных из потока stdout endOfPipe = grep.stdout # распечатка файлов в строку for line in endOfPipe: print(line) 
$ python find-files3.py find-files2.py find-files3.py find-files4.py . 

Данное решение работает достаточно хорошо с Python 2 и 3, но его можно улучшить. Рассмотрим другие варианты.

Комбинация os и fnmatch

Решение, использующее подпроцессы, элегантно, но требует большого количества кода. Вместо этого, давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.

В качестве первого шага, импортируем модули os и fnmatch. Далее определим каталог, в котором нужно перечислить файлы, используя os.listdir(), а также шаблон для фильтрации файлов. В цикле for выполняется итерация списка записей, хранящихся в переменной listOfFiles.

В завершение, с помощью fnmatch отфильтровываются искомые записи и распечатываются соответствующие записи в stdout.

import os, fnmatch listOfFiles = os.listdir('.') pattern = "*.py" for entry in listOfFiles: if fnmatch.fnmatch(entry, pattern): print(entry) 
$ python find-files.py find-files.py find-files2.py find-files3.py . 

Использование os.listdir() и генераторов

Следующий вариант объединяет метод os.listdir() с функцией генератором. Код работает как с версиями 2, так и с 3 Python.

Как уже было сказано ранее, listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. Оператор yield завершает работу функции, но сохраняя текущее состояние и возвращает только имя записи являющейся файлом.

import os def files(path): for file in os.listdir(path): if os.path.isfile(os.path.join(path, file)): yield file for file in files("."): print(file) 

Использование pathlib

Модуль pathlib предназначен для парсинга, сборки, тестирования и иной работы с именами файлов и их путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций. Начиная с Python 3 модуль находится в стандартной библиотеке.

В следующем листинге определяется текущий каталог точкой («.»). Затем метод iterdir() возвращает итератор, который возвращает имена всех файлов. Далее циклом for распечатываются имена файлов друг за другом.

import pathlib # определение пути currentDirectory = pathlib.Path('.') for currentFile in currentDirectory.iterdir(): print(currentFile) 

В качестве альтернативы, можно отфильтровать файлы по именам с помощью метода glob. Таким образом, получаем требуемые файлы. Например, в приведенном ниже коде перечисляются Python файлы в выбранном каталоге, указав шаблон «*.py» в glob.

import pathlib # определение пути currentDirectory = pathlib.Path('.') # определение шаблона currentPattern = "*.py" for currentFile in currentDirectory.glob(currentPattern): print(currentFile) 

Использование os.scandir()

В Python 3.6 добавлен новый метод scandir(), доступный из модуля os. Как понятно из названия он значительно упрощает получение списка файлов в каталоге.

Чтобы определить текущий рабочий каталог и сохранить его, инициализируем значение переменной path, для этого импортируем модуль os и вызовем функцию getcwd(). Далее, scandir() возвращает список записей для выбранного пути, которые проверяются на принадлежность файлу, используя метод is_file().

import os # определение текущей рабочей директории path = os.getcwd() # чтение записей with os.scandir(path) as listOfEntries: for entry in listOfEntries: # печать всех записей, являющихся файлами if entry.is_file(): print(entry.name) 

Вывод

Ведутся споры, какой вариант является лучшим, какой наиболее элегантным и какой является наиболее «питоничным». Мне нравится простота метода os.walk(), а также модули fnmatch и pathlib.

Две версии с процессами/конвейером и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они не могут быть предпочтительными для всех программистов из-за их дополнительной (и избыточной) сложности.

Чтобы найти ответ на этот вопрос, выберем самой быстрой из них, воспользовавшись удобным модулем timeit. Данный модуль подсчитывает время, прошедшее между двумя событиями.

Для сравнения всех решений без их изменений, воспользуемся функциональностью Python: вызовем интерпретатор с модулем timeit и соответствующим Python скриптом. Для автоматизации процесса напишем shell скрипт

#! /bin/bash for filename in *.py; do echo "$filename:" cat $filename | python3 -m timeit echo " " done 

Тесты проводились с использованием Python 3.6. Среди всех тестов os.walk() показала себя наилучшим образом. Выполнение тестов с помощью Python 2 возвращает разные значения, но os.walk() по-прежнему находится на вершине списка.

Выводим расширение файла

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

Решение:

def get_extension(filename): filename_parts = filename.split('.') if len(filename_parts) < 2: # filename has no dots raise ValueError('the file has no extension') first, *middle, last = filename_parts if not last or not first and not middle: # example filenames: .filename, filename., file.name. raise ValueError('the file has no extension') return filename_parts[-1] print(get_extension('abc.py')) print(get_extension('abc')) # raises ValueError print(get_extension('.abc')) # raises ValueError print(get_extension('.abc.def.')) # raises ValueError

Чтение имени файла средствами Python

Есть видео файл, нужно имя файла сохранить в переменную (для дальнейших преобразований), но сохранить нужно до расширения(.mp4). Как это сделать?

Отслеживать
задан 17 сен 2018 в 15:51
Sacred Sacred Sacred Sacred
381 1 1 золотой знак 7 7 серебряных знаков 21 21 бронзовый знак
Используйте docs.python.org/3/library/pathlib.html
17 сен 2018 в 15:54

Файл лежит на диске (известно ли где конкретно?) и нужно прочитать его имя? Или имя файла уже есть и нужно просто отбросить расширение?

17 сен 2018 в 16:02

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

from pathlib import Path file_name = 'C:/Users/111/video.mp4' path = Path(file_name) print(path.name) # video.mp4 print(path.stem) # video 

Отслеживать
ответ дан 17 сен 2018 в 16:17
77k 6 6 золотых знаков 56 56 серебряных знаков 123 123 бронзовых знака

Когда вы имеете имя+расширение в переменной filename:

In[152]: filename = "some_video.mp4" 

вы можете использовать модуль os.path :

In[151]: import os.path In[153]: name, __ = os.path.splitext(filename) In[154]: name Out[154]: 'some_video' 

В переменной __ будет расширение, но оно вам не нужно (потому такое чудесное имя):

In[155]: __ Out[155]: '.mp4' 

Как получить имя файла?

Author24 — интернет-сервис помощи студентам

Как получить имя слайдера и его значение
Здравствуйте! Подскажите пожалуйста, как получить в print() два переменных, одну с имением.

Как получить имя файла из формы
Здравствуйте! Есть форма, на основе некоторой модели в котором такое поле: file =.

Строка: Получить имя и расширение файла.
Дана строка, содержащая полный путь к файлу, начиная с диска. Вывести только имя файла и расширение.

Имя "." не распознано как имя командлета, функции, файла сценария или выполняемой программы
Всем добрый день! Только недавно начал изучать Python и начал с редактора Pycharm. Установку.

Как получить имя учётки
Как получить имя учётной записи в windows, как получить имя пк понятно, подскажите как получить имя.

906 / 677 / 260
Регистрация: 10.12.2016
Сообщений: 1,653

1 2 3 4 5 6
>>> f = os.listdir()[0] >>> os.path.abspath(f) '/Users/admin/projects/fb2/xmlhighlighter.py' >>> os.path.basename(f) 'xmlhighlighter.py' >>>

Эксперт Python

2684 / 1590 / 512
Регистрация: 21.02.2017
Сообщений: 4,207
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено HumidiFire как решение

Решение

HumidiFire,

filePath, ok = QFileDialog.getOpenFileName(self, "Выберите файлы", "", "*.pdf") if ok: fileName = QFileInfo(filePath).fileName()

Регистрация: 05.04.2021
Сообщений: 13
Нашел ещё вот такой способ с помощью библиотеки os:

self.file_document, _ = QFileDialog.getOpenFileName(self, "Выберите файлы", "", "*.pdf") self.file_document_name = os.path.basename(self.file_document)

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Conda : Имя "conda" не распознано как имя командлета, функции, файла сценария или выполняемой программы
Я вообще практически не понимаю Python. Просто мой проект требует написания на Python'e которого я.

Pip : Имя "pip" не распознано как имя командлета, функции, файла сценария или выполняемой программы
Если что япереустановил python 10 на python 9 вылезает такая ошибка при вводе в терминал к.

Как вывести имя файла
Есть вот такой кусок кода: import numpy as np import pandas as pd import matplotlib.pyplot as.

Как записать в строку байтов имя файла?
Как записать в строку байтов имя файла? появляется ошибка, что 'bytes' object has no attribute.

Из строки, содержащей полное имя файла, получить имя файла
Помогите Дана строка, содержащая полное имя файла, то есть имя диска, список каталогов (путь).

Или воспользуйтесь поиском по форуму:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *