Использование pathlib
Модуль pathlib предназначен для парсинга, сборки, тестирования и иной работы с именами файлов и их путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций. Начиная с Python 3 модуль находится в стандартной библиотеке.
В следующем листинге определяется текущий каталог точкой («.»). Затем метод iterdir() возвращает итератор, который возвращает имена всех файлов. Далее циклом for распечатываются имена файлов друг за другом.
В качестве альтернативы, можно отфильтровать файлы по именам с помощью метода glob. Таким образом, получаем требуемые файлы. Например, в приведенном ниже коде перечисляются Python файлы в выбранном каталоге, указав шаблон «*.py» в glob.
Решение
Способ 1. Уменьшаем путь до файла
Есть несколько способов сократить путь до нужной нам папки.
1. Переименовываем все папки, в которые вложен наш файл, на менее длинные названия. Когда путь сократится, можно выполнить удаление или перемещение.
2. Создаем символьную ссылку на конечный путь. Это можно сделать командой:
mklink /d c:\<короткий путь> c:\<длинный путь>
… например:
mklink /d «C:\Папка0» «C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5»
* в данном примере перейдя по пути C:\Папка0, мы окажемся в папке C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5.
3. Сопоставляем папку букве диска с помощью команды subst:
subst S: «C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5»
* в данном примере мы создадим диск S, который будет вести нас в папку C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5.
Способ 2. Включаем поддержку длинных файлов
Данный способ поддерживается, начиная с Windows 10 / Server 2016.
Ограничение в 255 символов — пережиток прошлого, необходимый для обеспечения совместимости с другими файловыми системами. Система не будет работать хуже, если данное ограничение отключить.
Открываем реестр (команда regedit) и переходим по пути HKLM\SYSTEM\CurrentControlSet\Control\FileSystem. Находим или создаем ключ LongPathsEnabled с типом REG_DWORD и задаем ему значение 1.
Это же действие из командной строки:
reg delete «HKLM\SYSTEM\CurrentControlSet\Control\FileSystem» /v LongPathsEnabled /f
reg add «HKLM\SYSTEM\CurrentControlSet\Control\FileSystem» /v LongPathsEnabled /t REG_DWORD /d 1
* первая команда, на всякий случай, удалит старый параметр (если его нет, команда вернет ошибку). Вторая — создаст нужный нам ключ.
Способ 3. Far Manager
Устанавливаем программу Far Manager — переходим в нужный каталог и выполняем нужные действия над файлами.
Иногда, данный способ работает только после того, как мы включили поддержку длинных имен (способ 2).
Способ 4. Укорачиваем сетевой путь
Настраиваем сетевой доступ к папке и подключаем ее как сетевой диск. Путь станет меньше.
Например, это можно сделать командой:
net use J: \\server\share /persistent:yes
* данной командой мы создадим диск J, который будет вести на сетевую папку \\server\share.
Способ 5. Используем командную строку
Если нам нужно скопировать или перенести небольшое количество файлов, мы можем воспользоваться командной строкой. Для копирования используем xcopy, для переноса — move.
Примеры использования:
xcopy <длинный путь до файла> <короткий путь>
move <длинный путь до файла> <короткий путь>
9 ответов
Лучший ответ
Часто первая пара символов будет магическим числом для различных форматов файлов. Вы можете проверить это в дополнение к проверке исключений выше.
10
Brian R. Bondy
20 Май 2009 в 17:58
Я только что нашел встроенный imghdr модуль. Из документации Python:
Вот как это работает:
Использование модуля намного лучше, чем повторная реализация аналогичной функциональности.
183
Nadia Alramli
24 Май 2009 в 00:29
В дополнение к тому, что предлагает Брайан, вы можете использовать метод . проверить, не поврежден ли файл.
45
Two-Bit Alchemist
8 Авг 2014 в 18:32
Вы можете использовать привязки Python к libmagic, python-magic, а затем проверить MIME типы. Это не скажет вам, повреждены ли файлы или нет, но должно быть в состоянии определить, какой тип изображения это.
3
Kamil Kisiel
20 Май 2009 в 19:29
В дополнение к проверке изображения вы также можете добавить проверку расширения имени файла следующим образом:
Обратите внимание, что это только проверяет, имеет ли имя файла допустимое расширение изображения, фактически не открывает изображение, чтобы увидеть, является ли оно допустимым изображением, поэтому вам необходимо дополнительно использовать или одну из библиотек, предложенных в другие ответы. 4
tsveti_iko
8 Авг 2019 в 09:26
4
tsveti_iko
8 Авг 2019 в 09:26
Обновление
Я также реализовал следующее решение в своем скрипте Python здесь, на GitHub.
Я также проверил, что поврежденные файлы (jpg) часто не являются «испорченными» изображениями, т.е. поврежденный файл изображения иногда остается допустимым файлом изображения, исходное изображение потеряно или изменено, но вы все равно можете загрузить его без ошибок. Но, усечение файла всегда вызывает ошибки.
Завершить обновление
Вы можете использовать модуль Python Pillow (PIL) с большинством графических форматов, чтобы проверить, является ли файл действительным и неповрежденным файлом изображения.
В случае, если вы хотите обнаружить также поврежденные изображения, @Nadia Alramli правильно предлагает метод , но этот не обнаруживает все возможные дефекты изображения , например, не обнаруживает усеченные изображения (которые большинство зрителей часто загружают с серой областью).
Подушка также может обнаруживать дефекты этого типа, но вам нужно применить манипуляцию с изображением или декодировать / перекодировать изображение, чтобы инициировать проверку. Наконец, я предлагаю использовать этот код:
В случае дефектов изображения этот код вызовет исключение. Пожалуйста, учтите, что im.verify примерно в 100 раз быстрее, чем выполнение манипуляций с изображениями (и я думаю, что flip — это одно из самых дешевых преобразований). С помощью этого кода вы будете проверять набор изображений со скоростью около 10 МБ / с со стандартной подушкой или 40 МБ / с с модулем Pillow-SIMD (современный процессор с частотой 2,5 ГГц x86_64).
Для других форматов psd , xcf , .. вы можете использовать Imagemagick обертку Wand , код выглядит следующим образом :
Но из моих экспериментов Wand не обнаруживает усеченные изображения, я думаю, он загружает недостающие части в виде серой области без запроса.
Я заметил, что Imagemagick имеет внешнюю команду определить , что может выполнить работу, но я не нашел способа вызвать эту функцию программно, и я не проверял этот маршрут.
Я предлагаю всегда выполнять предварительную проверку, проверьте, чтобы filesize не был нулевым (или очень маленьким), это очень дешевая идея:
5
Fabiano Tarlao
28 Ноя 2018 в 01:30
В Linux вы можете использовать python-magic (http://pypi.python.org/ pypi / python-magic / 0.1), которая использует libmagic для определения форматов файлов.
AFAIK, libmagic просматривает файл и пытается рассказать вам больше о нем, чем просто о формате, например о растровых измерениях, версии формата и т. Д. Так что вы можете увидеть это как поверхностный тест на «достоверность».
Для других определений «действительный» вам, возможно, придется написать свои собственные тесты.
3
fmarc
20 Май 2009 в 18:22
Будет ли проверка расширений файлов приемлемой или вы пытаетесь подтвердить, что сами данные представляют собой файл изображения?
Если вы можете проверить расширение файла, регулярное выражение или простое сравнение может удовлетворить требование.
1
doomspork
20 Май 2009 в 17:57
Ну, я не знаю о внутренностях PSD, но я, конечно, знаю, что, по сути, SVG не является файлом изображения как таковым, — он основан на XML, так что, по сути, это простой текстовый файл.
2
shylent
20 Май 2009 в 18:03
Открытие файлов в Python
Python по умолчанию предоставляет нам функцию open(), которая предназначена для открытия файла. Рассмотрим пример использования данной функции.
file = open("text.txt") # Открытие файла file = open("C:/text.txt") #Открытие файла по его пути
Существует несколько режимов открытия файла, r — для чтения, w — для записи, a — для добавления. По умолчанию Python использует режим чтение файла
Режим | Описание |
r | Открывает файл для чтения. (по умолчанию) |
w | Открывает файл для записи. Создает новый файл, если он не существует, или усекает файл, если он существует. |
x | Открывает файл для эксклюзивного создания. Если файл уже существует, операция завершается неудачей. |
a | Открывает файл для добавления в конце файла без его усечения. Создает новый файл, если он не существует. |
t | Открывается в текстовом режиме. (по умолчанию) |
b | Открывается в двоичном режиме. |
+ | Открывает файл для обновления (чтения и записи) |
Режим открытия указывается следующим образом:
f = open("text.txt") #Режим r по умолчанию f = open("text.txt", "w")# Режим записи в файл f = open("text.txt", "a") # Режим добавления
Кроме того, надо учитывать кодировку файла, по умолчанию кодировка зависит от вашей операционной системы. Для Windows, кодировка cp1251, а для Linux utf — 8. Соответственно, что бы наша программа вела себя одинаково на разных платформах, лучшим решением будет указание явной кодировки.
file = open("text.txt", "r", encoding = "utf-8" )
Проверка существует ли файл используя open() и try … except
Мы только что рассматривали, как функции в модуле могут быть использованы для проверки существования файла или папки.
Есть еще один прямолинейный алгоритм Python для проверки существования файла: Вы просто пытаетесь открыть файл при помощи встроенной функции , вот так:
Python
open(‘нет-такого-файла.txt’)
FileNotFoundError:
» No such file or directory: ‘нет-такого-файла.txt'»
1 2 3 |
open(‘нет-такого-файла.txt’) FileNotFoundError » No such file or directory: ‘нет-такого-файла.txt'» |
Если файл существует, то файл успешно откроется и вернет валидный объект для дальнейшей обработки файла. Если файл не существует, появится ошибка FileNotFoundError:
Это значит, что вы можете получить ошибку FileNotFoundError в своем коде, и использовать ее для обнаружения того, существует файл или нет. Вот пример кода, который демонстрирует работу этой техники:
Python
try:
f = open(‘нет-такого-файла.txt’)
f.close()
except FileNotFoundError:
print(‘Файл не существует!’)
1 2 3 4 5 |
try f=open(‘нет-такого-файла.txt’) f.close() exceptFileNotFoundError print(‘Файл не существует!’) |
Обратите внимание, мы мгновенно вызываем метод для объекта файла для освобождения дескриптора файла. Это считается хорошей практикой при работе с файлами в Python:. Если вы не закроете дескриптор файлов, то будет сложно понять, когда именно он будет закрыт автоматически во время работы Python
Это занимает ресурсы системы и может снизить производительность ваших программ
Если вы не закроете дескриптор файлов, то будет сложно понять, когда именно он будет закрыт автоматически во время работы Python. Это занимает ресурсы системы и может снизить производительность ваших программ.
Вместо того, чтобы закрывать файл при помощи метода , есть еще один способ, которым можно воспользоваться контекстным менеджером и оператора with для автоматического закрытия файла.
Теперь, та же техника “просто попробуем открыть файл” также работает для выяснения, является ли файл доступным и читаемым. Вместо поиска ошибок FileNotFoundError, вам нужно искать любые ошибки типа IOError:
Python
try:
f = open(‘new-music.mp3’)
f.close()
except IOError:
print(‘Файл недоступен’)
print(‘Файл доступен’)
1 2 3 4 5 6 |
try f=open(‘new-music.mp3’) f.close() exceptIOError print(‘Файл недоступен’) print(‘Файл доступен’) |
Если вы часто используете этот шаблон, вы можете выделить его в вспомогательную функцию, которая позволит вам проверить, существует ли файл и является ли он в то же время доступным:
Python
def is_accessible(path, mode=’r’):
«»»
Проверка, является ли файл или папка из `path`
доступным для работы в предоставленным `mode` формате.
«»»
try:
f = open(path, mode)
f.close()
except IOError:
return False
return True
1 2 3 4 5 6 7 8 9 10 11 |
defis_accessible(path,mode=’r’) «»» Проверка, является ли файл или папка из `path` try f=open(path,mode) f.close() exceptIOError returnFalse returnTrue |
Как альтернатива, вы можете использовать функцию из стандартной библиотеке для проверки того, существует ли файл и является ли он доступным в то же время. Это может быть похоже на использование функции , если файл существует.
Использование и имеет некоторые преимущества, когда доходит до обработки файлов в Python. Это может помочь вам избежать накладок, вызванных определенными условиями существования файла:
Представим, что файл существует в тот момент, когда вы запускаете проверку, файл удаляется другим процессом независящий от вас. Когда вы пытаетесь открыть файл для работы с ним, он исчезает и ваша программа получает ошибку.
Мы рассмотрим этот случай в конце руководства. Но перед этим, запрыгнем в еще одну кроличью нору. Рассмотрим еще один способ того, как проверить, существует ли файл в Python.
How to Compare Strings in Bash
17 Мая 2020
|
Терминал
Это руководство описывает, как сравнивать строки в Bash.
При написании сценариев Bash вам часто нужно сравнивать две строки, чтобы проверить, равны они или нет. Две строки равны, если они имеют одинаковую длину и содержат одинаковую последовательность символов.
Операторы сравнения
Операторы сравнения — это операторы, которые сравнивают значения и возвращают true или false. При сравнении строк в Bash вы можете использовать следующие операторы:
-
и — Оператор равенства возвращает true, если операнды равны.
- Используйте оператор с командой.
- Используйте оператор с командой для сопоставления с образцом.
- — Оператор неравенства возвращает true, если операнды не равны.
- — Оператор регулярного выражения возвращает true, если левый операнд соответствует расширенному регулярному выражению справа.
- — Оператор «больше чем» возвращает истину, если левый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
- — Оператор less than возвращает true, если правый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
- — Истина, если длина строки равна нулю.
- — Истина, если длина строки не равна нулю.
Ниже следует отметить несколько моментов при сравнении строк:
- Пустое пространство должно быть использовано между бинарным оператором и операндами.
- Всегда используйте двойные кавычки вокруг имен переменных, чтобы избежать каких-либо проблем с разделением слов или смещениями
- Bash не разделяет переменные по «типу», переменные обрабатываются как целое число или строка в зависимости от контекста.
Проверьте, равны ли две строки
В большинстве случаев при сравнении строк вы хотите проверить, равны ли строки или нет.
Следующий скрипт использует оператор if и команду test, чтобы проверить, совпадают ли строки с оператором:
Когда скрипт выполняется, он напечатает следующий вывод.
Вот еще один скрипт, который принимает входные данные от пользователя и сравнивает заданные строки. В этом примере мы будем использовать команду и оператор.
Запустите скрипт и введите строки при появлении запроса:
Вы также можете использовать логические и и или для сравнения строк:
Проверьте, содержит ли строка подстроку
Есть несколько способов проверить, содержит ли строка подстроку.
Один из подходов заключается в использовании подстроки с символами звездочки, что означает совпадение всех символов.
Скрипт отобразит следующее:
Другой вариант — использовать оператор регулярного выражения, как показано ниже:
Точка, за которой следует звездочка, соответствует нулю или большему количеству вхождений любого символа, кроме символа новой строки.
Проверьте, пуста ли строка
Довольно часто вам также необходимо проверить, является ли переменная пустой строкой или нет. Вы можете сделать это, используя и оператор.
Лексикографическое сравнение
Лексикографическое сравнение — это операция, в которой две строки сравниваются в алфавитном порядке путем сравнения символов в строке последовательно слева направо. Этот вид сравнения используется редко.
Следующие сценарии сравнивают две строки лексикографически:
Скрипт выведет следующее:
Сравнение строк — одна из самых основных и часто используемых операций в сценариях Bash. Прочитав этот урок, вы должны хорошо понимать, как сравнивать строки в Bash. Вы также можете проверить наше руководство о конкатенации строк .
Операция in
С помощью in мы можем проверить наличие элемента в списке, строке и любой другой итерируемой переменной.
fruits =
if ‘Apple’ in fruits:
print(‘В списке есть элемент Apple’)
>>> В списке есть элемент Apple
fruits =
if ‘Lemon’ in fruits:
print(‘В списке есть элемент Lemon’)
else:’
print(‘В списке НЕТ элемента Lemon’)
>>> В списке НЕТ элемента Lemon
Приведу более сложный пример:
all_fruits =
my_favorite_fruits =
for item in all_fruits:
if item in my_favorite_fruits:
print(item + ‘ is my favorite fruit’)
else:
print(‘I do not like ‘ + item)
>>> Apple is my favorite fruit
>>> I do not like Grape
>>> I do not like Peach
>>> Banan is my favorite fruit
>>> Orange is my favorite fruit
Методы проверки наличия файла в Python
Мы можем проверить, существует ли файл в Python, используя различные методы, упомянутые ниже.
1. Использование модуля pathlib
Модуль в Python поставляется с некоторыми интересными методами, такими как , , и т. Д. Давайте рассмотрим несколько примеров один за другим:
import pathlib path = pathlib.Path('file.txt') print("pathlib-exists()---->",path.exists()) print("pathlib-is_file()---->",path.is_file()) print("pathlib-is_dir()---->",path.is_dir())
Выход:
- патлиб.Path() возвращает объект path, который приводит к указанному имени файла, хранящемуся в переменной ‘ path ‘ ,
- метод path lib.exists() проверяет, ведет ли указанный путь к допустимому файлу или нет. В нашем случае, как file.txt путь существует, результат верен.
- с другой стороны, метод is_file() проверяет, является ли объект path файлом. Что в нашем случае верно, как мы видим на выходе.
- метод is_dir() проверяет, является ли указанный путь каким-либо каталогом. Здесь, так как наши file.txt путь-это не каталог, который мы получаем на выходе.
2. Использование модуля ОС
Одним из широко используемых методов проверки существования файлов является модуль os.path из стандартной библиотеки python. Он поставляется с некоторыми базовыми методами, такими как и , аналогичными модулю pathlib . Давайте подробнее рассмотрим один пример:
import os.path print("os.path-exists()---->",os.path.exists('file.txt')) print("os.path-isfile()---->",os.path.isfile('file.txt'))
Выход:
- Аналогично path lib modules и методы , а также также выполняют аналогичную проверку соответственно.
- Единственное различие заключается в том, что модуль pathlib привносит какой-то отличный объектно-ориентированный подход и рассматривает путь как объект пути, а не строку(в случае модуля ос).
3.Использование обработки исключений
Давайте теперь рассмотрим несколько различных методов, чтобы проверить, существует ли файл в Python с помощью исключений.
На этот раз мы собираемся использовать встроенную функцию , чтобы открыть файл и проверить наличие исключения , которое, если оно возникнет, подтвердит, что файл не существует или недоступен. Например:
My_file=open('file.txt') try: My_file.close() print("File found!") except FileNotFoundError: print("Files couldn't be opened!")
Выход:
File found!
В приведенном выше коде с file.txt существовал в нашей системе, FileNotFoundError не вызывается, и файл успешно закрывается.
Опять же, когда no-file.txt не существует на вашем компьютере:
try: My_file=open('no-file.txt') My_file.close() print("File found!") except FileNotFoundError: print("Files couldn't be opened!")
Выход:
Таким образом, мы можем ясно видеть, что, когда файл не найден, возникает исключение FileNotFoundError .
Кроме того, та же задача может быть достигнута с помощью , который проверяет, является ли открываемый файл читаемым и доступным для программы. Например, рассмотрим следующий фрагмент кода:
try: My_file = open('no-file.txt') My_file.close() print('File is found!') except IOError: print('IOError encountered!')
Выход:
Что такое метод read() в Python?
Метод будет считывать все содержимое файла как одну строку. Это хороший метод, если в вашем текстовом файле мало содержимого .
В этом примере давайте используем метод для вывода на экран списка имен из файла demo.txt:
file = open("demo.txt") print(file.read())
Запустим этот код и получим следующий вывод:
# Output: # This is a list of names: # Jessica # James # Nick # Sara
Этот метод может принимать необязательный параметр, называемый размером. Вместо чтения всего файла будет прочитана только его часть.
Если мы изменим предыдущий пример, мы сможем вывести только первое слово, добавив число 4 в качестве аргумента для .
file = open("demo.txt") print(file.read(4)) # Output: # This
Если аргумент размера опущен или число отрицательное, то будет прочитан весь файл.
Как открыть текстовый файл в Python с помощью open()
Если вы хотите прочитать текстовый файл с помощью Python, вам сначала нужно его открыть.
Вот так выглядит основной синтаксис функции :
open("name of file you want opened", "optional mode")
Имена файлов и правильные пути
Если текстовый файл, который нужно открыть, и ваш текущий файл находятся в одной директории (папке), можно просто указать имя файла внутри функции . Например:
open ("demo.txt")
На скрине видно, как выглядят файлы, находящиеся в одном каталоге:
Но если ваш текстовый файл находится в другом каталоге, вам необходимо указать путь к нему.
В этом примере файл со случайным текстом находится в папке, отличной от той, где находится файл с кодом main.py:
В таком случае, чтобы получить доступ к этому файлу в main.py, вы должны включить имя папки с именем файла.
Если путь к файлу будет указан неправильно, вы получите сообщение об ошибке .
Таким образом, чтобы указать путь к файлу правильно, важно отслеживать, в каком каталоге вы находитесь
Необязательный параметр режима в open()
При работе с файлами существуют разные режимы. Режим по умолчанию – это режим чтения.
Он обозначается буквой .
open("demo.txt", mode="r")
Вы также можете опустить и просто написать .
open("demo.txt", "r")
Существуют и другие типы режимов, такие как для записи или для добавления. Мы не будем вдаваться в подробности о других режимах, потому что в этой статье сосредоточимся исключительно на чтении файлов.
Полный список других режимов можно найти в .
Дополнительные параметры для функции open() в Python
Функция может также принимать следующие необязательные параметры:
- buffering
- encoding
- errors
- newline
- closefd
- opener
Если вы хотите узнать больше об этих опциональных параметрах, можно заглянуть в .
Вступление
Как проверить, существует ли файл в Python? Мы научились выполнять различные операции с файлом в наших предыдущих учебниках по обработке файлов , включая чтение , запись , удаление , а также копирование файла на Python. Но прежде чем мы выполним какую-либо из этих операций с файлом, необходимо проверить, существует ли файл уже или нет.
Если файл не существует, то мы не можем ни читать из него, ни копировать, ни удалять его. Даже во время записи пользователь может захотеть проверить наличие файла, чтобы избежать перезаписи информации.
Давайте перейдем к теме и рассмотрим некоторые методы проверки существования файла.
Закрытие файла в Python
После того, как мы открыли файл, и выполнили все нужные операции, нам необходимо его закрыть. Для закрытия файла используется функция close().
file = open("text.txt", "r", encoding = "utf-8" ) file.close()
Вышеописанный код, это всего лишь пример работы с файлами, мы не должны забывать, что в ходе работы нашей программы, может произойти что то непредвиденное. Для таких случаев мы используем блок try…finally, о котором мы говорим чуть позже. Ниже пример, с блоком исключений:
try: file = open("text.txt", "r", encoding = "utf-8" ) finally: file.close()
Данная конструкция, гарантирует нам правильное закрытие файла, даже если произойдет ошибка в ходе работы нашей программы.
Лучшим же методом правильного закрытия файла, является конструкция with. Данная конструкция гарантирует нам правильное закрытие файла.
with open("text.txt", "r", encoding = "utf-8" ) as file:
Индексирование
Что же такое индексирование? Это загадочное слово обозначает операцию обращения к элементу по его порядковому номеру ( ( ・ω・)ア напоминаю, что нумерация начинается с нуля). Проиллюстрируем это на примере:
fruits =
print(fruits[])
print(fruits)
print(fruits)
>>> Apple
>>> Grape
>>> Orange
Списки в Python являются изменяемым типом данных. Мы можем изменять содержимое каждой из ячеек:
fruits =
fruits[] = ‘Watermelon’
fruits = ‘Lemon’
print(fruits)
>>>
Индексирование работает и в обратную сторону. Как такое возможно? Всё просто, мы обращаемся к элементу списка по отрицательному индексу. Индекс с номером -1 дает нам доступ к последнему элементу, -2 к предпоследнему и так далее.
fruits =
print(fruits)
print(fruits)
print(fruits)
print(fruits)
>>> Orange
>>> Banan
>>> Peach
>>> Grape
Комбинация os и fnmatch
Решение, использующее подпроцессы, элегантно, но требует большого количества кода. Вместо этого, давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.
В качестве первого шага, импортируем модули os и fnmatch. Далее определим каталог, в котором нужно перечислить файлы, используя os.listdir(), а также шаблон для фильтрации файлов. В цикле for выполняется итерация списка записей, хранящихся в переменной listOfFiles.
В завершение, с помощью fnmatch отфильтровываются искомые записи и распечатываются соответствующие записи в stdout.
Результат выполнения
Чтение файла
С помощью файлового метода можно прочитать файл целиком или только определенное количество байт. Пусть у нас имеется файл data.txt с таким содержимым:
one - 1 - I two - 2 - II three - 3 - III four - 4 - IV five - 5 - V
Откроем его и почитаем:
>>> f1 = open('data.txt') >>> f1.read(10) 'one - 1 - ' >>> f1.read() 'I\ntwo - 2 - II\nthree - 3 - III\n four - 4 - IV\nfive - 5 - V\n' >>> f1.read() '' >>> type(f1.read()) <class 'str'>
Сначала считываются первые десять символов. Последующий вызов считывает весь оставшийся текст. После этого объект файлового типа f1 становится пустым.
Заметим, что метод возвращает строку, и что конец строки считывается как .
Для того, чтобы читать файл построчно существует метод :
>>> f1 = open('data.txt') >>> f1.readline() 'one - 1 - I\n' >>> f1.readline() 'two - 2 - II\n' >>> f1.readline() 'three - 3 — III\n'
Метод считывает сразу все строки и создает список:
>>> f1 = open('data.txt') >>> f1.readlines()
Объект файлового типа относится к итераторам. Из таких объектов происходит последовательное извлечение элементов. Элементами в данном случае являются строки-линии файла. Поэтому считывать данные из них можно сразу в цикле без использования методов чтения:
>>> for i in open('data.txt'): ... print(i) ... one - 1 - I two - 2 - II three - 3 - III four - 4 - IV five - 5 - V >>>
Здесь выводятся лишние пустые строки, потому что функция преобразует в переход на новую строку. К этому добавляет свой переход на новую строку. Создадим список строк файла без :
>>> nums = [] >>> for i in open('data.txt'): ... nums.append(i) ... >>> nums
Переменной i присваивается очередная строка файла. Мы берем ее срез от начала до последнего символа, не включая его. Следует иметь в виду, что это один символ, а не два.
Функция open
Связь с файлом на жестком диске выполняется с помощью встроенной в Python функции . Обычно ей передают один или два аргумента. Первый – имя файла или имя с адресом, если файл находится не в том каталоге, где находится сама программа. Второй аргумент – режим, в котором открывается файл.
Обычно используются режимы чтения () и записи (). Если файл открыт в режиме чтения, то запись в него невозможна. Можно только считывать данные. Если файл открыт в режиме записи, то в него можно только записывать данные, считывать нельзя.
Если файл открывается в режиме , то все данные, которые в нем были до этого, стираются. Файл становится пустым. Если не надо удалять существующие в файле данные, тогда следует использовать вместо режима записи, режим дозаписи ().
Если файл отсутствует, то открытие его в режиме создаст новый файл. Бывают ситуации, когда надо гарантировано создать новый файл, избежав случайной перезаписи данных существующего. В этом случае вместо режима используется режим . В нем всегда создается новый файл для записи. Если указано имя существующего файла, то будет выброшено исключение. Потери данных в уже имеющемся файле не произойдет.
Если при вызове второй аргумент не указан, то файл открывается в режиме чтения как текстовый файл. Чтобы открыть файл как байтовый, дополнительно к букве режима чтения/записи добавляется символ . Буква обозначает текстовый файл. Поскольку это тип файла по умолчанию, то обычно ее не указывают.
Нельзя указывать только тип файла, то есть есть ошибка, даже если файл открывается на чтение. Правильно – . Только текстовые файлы мы можем открыть командой , потому что и и подразумеваются по-умолчанию.
Функция возвращает объект файлового типа. Его надо либо сразу связать с переменной, чтобы не потерять, либо сразу прочитать.
20 ответов
Лучший ответ
будет немного более эффективным, чем использование . Чтобы проверить, является ли имя файла обычным файлом (а не каталогом или другим объектом), используйте :
256
Bruno Bronosky
15 Сен 2014 в 22:06
Это использует и работает для любого каталога:
Это можно упростить с помощью генератора и сделать немного быстрее с помощью:
7
joaquin
7 Июн 2012 в 19:14
1
Mohit Dabas
29 Сен 2014 в 06:30
10
Marcus Riemer
20 Фев 2013 в 12:25
91
Luke
24 Апр 2018 в 09:29
Я сделал это, и это вернуло количество файлов в папке (Attack_Data) … это работает отлично.
jkalden
11 Янв 2017 в 16:03
Вот простая однострочная команда, которая мне показалась полезной:
4
Bojan Tunguz
9 Май 2016 в 18:23
Я нашел другой ответ, который может быть правильным как принятый ответ.
1
Ismail
19 Апр 2015 в 10:04
Если вы хотите сосчитать все файлы в каталоге, включая файлы в подкаталогах, самый питонический способ:
Мы используем сумму, которая быстрее, чем явное добавление количества файлов (время ожидания)
10
Mr_and_Mrs_D
22 Дек 2017 в 13:51
Взято из этой записи
5
Kristian Damian
13 Апр 2010 в 18:48
Это просто:
Он просто подсчитывает количество файлов в каталоге, я использовал технику понимания списка, чтобы перебрать определенный каталог, возвращая все файлы взамен. «len (возвращенный список)» возвращает количество файлов.
1
Agha Saad
31 Июл 2018 в 15:06
Если вы будете использовать стандартную оболочку операционной системы, вы можете получить результат гораздо быстрее, чем с использованием чисто питонического способа.
Пример для Windows:
1
styler
8 Апр 2015 в 13:38
Хотя я согласен с ответом @DanielStutzbach: будет несколько более эффективным, чем использование .
Однако для дополнительной точности, если вы хотите посчитать количество определенных файлов в папке, вы хотите использовать . Например, если вам нужно сосчитать все PDF-файлы в папке, которую вы хотите использовать:
1
LBes
18 Окт 2018 в 09:17
Для всех видов файлов, подкаталоги включены:
Только файлы (без подкаталогов):
43
Guillermo Pereira
14 Дек 2016 в 14:01
Я удивлен, что никто не упомянул :
8
qed
18 Май 2017 в 09:24
Я использовал для структуры каталогов, аналогичной
Обе следующие опции возвращают 4 (как и ожидалось, , т. Е. Сами вложенные папки не считаются )
user799188
24 Ноя 2016 в 06:45
Здесь очень удобно использовать fnmatch:
Подробнее: http://docs.python.org/2/library/fnmatch.html а>
30
ngeek
31 Май 2013 в 20:55
4
tzot
13 Апр 2010 в 22:31
12
rash
1 Июл 2014 в 10:18
Код Люка переформатировать.
4
okobaka
30 Май 2012 в 08:26
Методы работы с файлами
Методы | Описание |
close() | Закрывает открытый файл. |
detach() | |
fileno() | Возвращает целое число (файловый дескриптор) файла. |
flush() | Сбрасывает буфер записи потока файлов. |
isatty() | ВОЗВРАТ True если файловый поток является интерактивным. |
read(n) | Читает самое большее n символы из файла. Читает до конца файла, если он отрицательный или None. |
readable() | ВОЗВРАТ True если файловый поток можно прочитать. |
readline(n=-1) | Считывает и возвращает одну строку из файла |
readlines(n=-1) | Считывает и возвращает список строк из файла |
seek(offset,from=SEEK_SET) | |
seekable() | ВОЗВРАТ True если файловый поток поддерживает произвольный доступ. |
tell() | Возвращает текущее местоположение файла. |
truncate(size=None) | Изменяет размер потока файлов следующим образом size байты. Если size не указан, изменяет размер до текущего местоположения. |
writable() | ВозвращаетTrue, если файловый поток может быть записан. |
write(s) | Записывает строку sв файл и возвращает количество записанных символов. |
writelines(lines) | Записывает список lines в файл. |
Вывод
Ведутся споры, какой вариант является лучшим, какой наиболее элегантным и какой является наиболее «питоничным». Мне нравится простота метода os.walk(), а также модули fnmatch и pathlib.
Две версии с процессами/конвейером и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они не могут быть предпочтительными для всех программистов из-за их дополнительной (и избыточной) сложности.
Чтобы найти ответ на этот вопрос, выберем самой быстрой из них, воспользовавшись удобным модулем timeit. Данный модуль подсчитывает время, прошедшее между двумя событиями.
Для сравнения всех решений без их изменений, воспользуемся функциональностью Python: вызовем интерпретатор с модулем timeit и соответствующим Python скриптом. Для автоматизации процесса напишем shell скрипт
Тесты проводились с использованием Python 3.6. Среди всех тестов os.walk() показала себя наилучшим образом. Выполнение тестов с помощью Python 2 возвращает разные значения, но os.walk() по-прежнему находится на вершине списка.