Перейти к содержимому

Как проверить пустой ли файл python

  • автор:

Как проверить пустой ли файл csv Python

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

with open("itog.csv", newline='') as r: reader = csv.reader(r, delimiter=';') 

Отслеживать

задан 2 янв 2020 в 18:04

ChikChirik ChikChirik

524 2 2 золотых знака 13 13 серебряных знаков 43 43 бронзовых знака

проверить, пустой ли файл или нет: stackoverflow.com/questions/2507808/…

2 янв 2020 в 18:18

Файл из пробелов пустой или нет?

2 янв 2020 в 21:48

На правах догадки: по количеству элементов в списке readlines() если предполагается что заголовки полей в «пустом» файле должны присутствовать то количество элементов будет == 1 для «пустого» файла. Если же не предполагается наличие строки заголовков то == 0. Но если в пустом файле могут быть и заголовки и строки из одних разделителей тогда уже надо по другому

Python: проверка на пустоту файла или каталога

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

Определение файл или каталог

Когда мы хотим проверить, пуст ли путь или нет, мы захотим узнать, является ли он файлом или каталогом, поскольку это влияет на подход, который мы хотим использовать.

Допустим, у нас есть две переменные — dirpath и filepath идентифицирующие локальный каталог и файл:

dirpath = '/mnt/f/code.books/articles/python' filepath = '/mnt/f/code.books/articles/python/code/file_dir.py' 
Использование os.path

Python предоставляет модуль os , который представляет собой стандартный пакет Python функций, объектов и констант для работы с операционной системой.

os.path предоставляет нам функции isfile() и isdir() с помощью которых легко отличить файл и директорию:

import os dirpath = '/mnt/f/code.books/articles/python' filepath = '/mnt/f/code.books/articles/python/code/file_dir.py' os.path.isfile(dirpath) # False os.path.isdir(dirpath) # True os.path.isfile(filepath) # True os.path.isdir(filepath) # False 

Обе эти функции возвращают Boolean значение.

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

Python 3.4 представил модуль pathlib , который предоставляет объектно-ориентированный интерфейс для работы с файловыми системами.

pathlib упрощает работу с файловыми системами по сравнению с os или os.path .

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

from pathlib import Path dirpath = '/mnt/f/code.books/articles/python' filepath = '/mnt/f/code.books/articles/python/code/file_dir.py' Path(dirpath).is_file() # False Path(dirpath).is_dir() # True Path(filepath).is_file() # True Path(dirpath).is_file() # False 

Здесь мы проверяем, является ли объект Path файлом или каталогом.

Проверьте, пуст ли файл

Пустой файл или файл с нулевым байтом — это любой файл, который не содержит данных или содержимого. Файл может быть любого типа. Некоторые файлы (например, музыкальные файлы) могут не иметь данных, но все же содержать метаданные (например, автор). Такие файлы не могут рассматриваться как пустой файл.

В Linux и MacOS можно быстро создать пустой файл:

touch emptyfile
type nul > emptyfile

Давайте теперь определим переменные emptyfile и nonemptyfile указывая на пустой файл, имеющий нулевые байты, и непустой файл, имеющий размер одного байта:

emptyfile = '/mnt/f/code.books/articles/python/emptyfile' nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile' 

Давайте посмотрим на тип и размер этих файлов:

$ ls -l -rwxrwxrwx 1 root root 0 Sep 10 18:06 emptyfile -rwxrwxrwx 1 root root 1 Sep 10 18:08 onebytefile $ file emptyfile emptyfile: empty $ file onebytefile onebytefile: very short file (no magic)
Использование os.stat

В качестве альтернативы мы можем использовать Python модуль os для проверки этой информации. Функция os.stat() возвращает объект stat_result . Этот объект в основном представляет собой структуру данных, которая представляет собой набор свойств файла:

import os emptyfile = '/mnt/f/code.books/articles/python/emptyfile' nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile' result = os.stat(nonemptyfile) result.st_size # 1 result = os.stat(emptyfile) result.st_size # 0 
Использование os.path

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

os.path.getsize() возвращает размер файла, указанного как объект, подобный path-like, и его намного проще использовать, чем os.stat() :

import os emptyfile = '/mnt/f/code.books/articles/python/emptyfile' nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile' os.path.getsize(emptyfile) # 0 os.path.getsize(nonemptyfile) # 1
Использование pathlib

Если мы работаем c Python 3.4 или выше, мы можем использовать модуль pathlib для получения размера файла. Он в основном заменяет модуль os . Path.stat() возвращает свойство stat_result объекта Path , эквивалентное возвращаемому значению os.stat() :

from pathlib import Path emptyfile = '/mnt/f/code.books/articles/python/emptyfile' nonemptyfile = '/mnt/f/code.books/articles/python/onebytefile' print('File stats: ' + Path(emptyfile).stat()) print('File size: ' + Path(emptyfile).stat().st_size + ' byte(s)') print('File stats: ' + Path(nonemptyfile).stat()) print('File size: ' + Path(nonemptyfile).stat().st_size + ' byte(s)') 
File stats: os.stat_result(st_mode=33279, st_ino=14355223812249048, st_dev=17, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1600087010, st_mtime=1600087010, st_ctime=1600087010) File size: 0 byte(s) File stats: os.stat_result(st_mode=33279, st_ino=5629499534218713, st_dev=17, st_nlink=1, st_uid=0, st_gid=0, st_size=1, st_atime=1600088120, st_mtime=1600088072, st_ctime=1600088072) File size: 1 byte(s) 

Проверьте, пуст ли каталог

Каталог, в котором нет других файлов или подкаталогов, является пустым каталогом. Однако каждый каталог (даже пустой) содержит следующие 2 записи:

  1. . ссылается на текущий каталог и полезен в таких операциях, как поиск чего-либо внутри текущего каталога
  2. .. ссылается на родительский каталог текущего каталога, требуется для возврата из текущего каталога

Давайте определим две переменные — emptydirectory и nonemptydirectory укажем на пустой и непустой каталог:

emptydirectory = '/mnt/f/code.books/articles/python/markdown' nonemptydirectory = '/mnt/f/code.books/articles/python/code' 

В пустом каталоге нет никаких элементов:

$ pwd /mnt/f/code.books/articles/python/markdown $ ls -la total 0 drwxrwxrwx 1 root root 512 Sep 11 11:52 . drwxrwxrwx 1 root root 512 Sep 10 20:22 .. 

Непустой каталог содержит единственный файл:

$ pwd /mnt/f/code.books/articles/python/code $ ls -la total 0 drwxrwxrwx 1 root root 512 Sep 14 11:02 . drwxrwxrwx 1 root root 512 Sep 14 18:22 .. -rwxrwxrwx 1 root root 425 Sep 14 12:27 file_dir.py 
Использование os.listdir()

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

import os os.listdir(emptydirectory) # [] os.listdir(nonemptydirectory) # ['file_dir.py'] 

Расчет длины возвращенного списка легко определяет, пуст каталог или нет. Пустой каталог всегда имеет нулевую длину:

import os print(len(os.listdir(nonemptydirectory))) # 1 print(len(os.listdir(emptydirectory))) # 0 
Использование os.scandir()

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

Если каталог огромен, выполнение функции os.listdir() займет много времени, в то время как, если записей больше 0 , на наш вопрос будет дан ответ.

На помощь приходит функция os.scandir() , возвращающая ленивую итерацию или генератор.

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

Этот подход примерно в ~ 200 раз быстрее для каталогов из ~ 1000 файлов.

Поэтому вместо того, чтобы перебирать всю структуру каталогов, мы можем использовать os.scandir() , чтобы проверить, есть ли хотя бы одна запись в пути к каталогу:

import os emptydirectory = '/mnt/f/code.books/articles/python/markdown' nonemptydirectory = '/mnt/f/code.books/articles/python/code' print(next(os.scandir(emptydirectory), None)) print(next(os.scandir(nonemptydirectory), None)) #

Мы используем встроенную функцию next() для получения следующего доступного элемента из ленивого итератора, возвращаемого функцией os.scandir() . Поскольку в emptydirectory нет доступных элементов — он возвращается None , тогда как для nonemptydirectory возвращается объект os.DirEntry .

Вывод

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

Это можно сделать с помощью модулей os или pathlib и их удобных функций и классов.

Файлы и исключения в Python

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

Содержание страницы:
1. Чтение файла
1.2. Чтение больших файлов и работа с ними
1.3. Анализ текста из файла
2. Запись в файл
2.1. Запись в пустой файл
2.2. Многострочная запись в файл
2.3. Присоединение данных к файлу
3. Исключения
3.1. Блоки try-except
3.2. Блоки try-except- else
3.3. Блоки try-except с текстовыми файлами
3.4. Ошибки без уведомления пользователя

1. Чтение файла в Python

В файлах может содержаться любой объем данных, начиная от небольшого рассказа и до сохранения истории погоды за столетия. Чтение файлов особенно актуально для приложений, предназначенных для анализа данных. Приведем пример простой программы, которая открывает файл и выводит его содержимое на экран. В примере я буду использовать файл с числом «Пи» с точностью до 10 знаков после запятой. Скачать этот файл можно прямо здесь ( pi_10.txt ) или самим создать текстовый файл и сохранить под любым именем. Пример программы, которая открывает файл и выводит содержимое на экран:

with open (‘pi_10.txt’) as file_pi :
digits = file_pi . read()
print(digits)

Код начинается с ключевого слова with . При использование ключевого слова with используемый файл открывается с помощью функции open() , а закрывается автоматически после завершения блока with и вам не придется в конце вызывать функцию close() . Файлы можно открывать и закрывать явными вызовами open() и close() . Функция open() получает один аргумент — имя открываемого файла, в нашем случае ‘pi_10.txt’. Python ищет указанный файл в каталоге, где хранится файл текущей программы. Функция open() возвращает объект, представляющий файл ‘pi_10.txt’. Python сохраняет этот объект в переменной file_pi .

После появления объекта, представляющего файл ‘pi_10.txt’, используется метод read() , который читает все содержимое файла и сохраняет его в одной строке в переменной contents. В конце с помощью функции print содержимое выводится на экран. Запустив этот файл, мы получим данные, находящиеся в нашем файле ‘pi_10.txt’.

3.1415926535

В случае, если файл расположен не в одном каталоге с файлом программы, необходимо указать путь, чтобы Python искал файлы в конкретном месте. Существует два пути как прописать расположение файла:

Относительный путь.

Относительный путь приказывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы

with open (‘files/имя_файла.txt’) as file :

Абсолютный путь.

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

file_path = ‘/Users/Desktop/files/имя_файла.txt’
with open (file_path) as file :

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

1.2. Чтение больших файлов на Python и работа с ними

В первом примере был файл с 10 знаками после запятой. Теперь давайте проанализируем файл с миллионом знаков числа «Пи» после запятой. Скачать число «Пи» с миллионом знаков после запятой можно отсюда( ‘pi_1000000.txt’ ). Изменять код из первого примера не придется, просто заменим файл, который должен читать Python.

with open (‘ pi_1000000.txt ‘) as file_pi :
digits = file_pi . read()
print(digits[:102])
print(len(digits))

Выведем на экран первые 100 знаков после запятой. Добавим в конец функцию len, чтобы узнать длину файла

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

1000002

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

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

with open (‘ pi_1000000.txt ‘) as file_pi :
digits = file_pi . read()
birthday = input(«Введите дату дня рождения: «)
if birthday in digits:
print(«Ваш день рождение входит в число ‘Пи'»)
else:
print(«Ваш день рождение не входит в число ‘Пи'»)

Начало программы не изменилось, читаем файл и сохраняем данные в переменной digits. Далее запрашиваем данные от пользователя с помощью функции input и сохраняем в переменную birstday. Затем проверяем вхождение birstday в digits с помощью команды if-else. Запустив несколько раз программу, получим результат:

Введите дату дня рождения: 260786
Ваш день рождение не входит в число ‘Пи’

Введите дату дня рождения: 260884
Ваш день рождение входит в число ‘Пи’

В зависимости от введенных данных мы получили результат вхождения или не вхождения дня рождения в число «Пи»

Важно: Читая данные из текстового файла, Python интерпретирует весь текст как строку. Если вы хотите работать с ним в числовом контексте, то преобразуйте данные в целое число функцией int() или в вещественное число функцией float().

1.3. Анализ текста из файла на Python

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

with open (filename, encoding=’utf-8′) as file :
contents = file. read()
n_alice = contents. lower() . count( ‘алиса’ )
words = contents. split()
n_words = len (words)

print(f»Книга ‘Алиса в стране чудес’ содержит слов.»)
print(f»Имя Алиса повторяется < n_alice >раз.»)

При открытии файла добавился аргумент encoding=’utf-8′. Он необходим, когда кодировка вашей системы не совпадает с кодировкой читаемого файла. После чтения файла, сохраним его в переменной contents.

Для подсчета вхождения слова или выражений в строке можно воспользоваться методом count() , но прежде привести все слова к нижнему регистру функцией lower() . Количество вхождений сохраним в переменной n_alice.

Чтобы подсчитать количество слов в тексе, воспользуемся методом split() , предназначенный для построения списка слов на основе строки. Метод split() разделяет строку на части, где обнаружит пробел и сохраняет все части строки в элементах списка. Пример метода split() :

title = ‘Алиса в стране чудес’
print(title. split() )

[‘Алиса’, ‘в’, ‘стране’, ‘чудес’]

После использования метода split() , сохраним список в переменной words и далее подсчитаем количество слов в списке, с помощью функции len() . После подсчета всех данных, выведем на экран результат:

Книга ‘Алиса в стране чудес’ содержит 28389 слов.
Имя Алиса повторяется 419 раз.

2.1. Запись в пустой файл в Python

Самый простой способ сохранения данных, это записать их в файл. Чтобы записать текс в файл, требуется вызвать open() со вторым аргументом, который сообщит Python что требуется записать файл. Пример программы записи простого сообщения в файл на Python:

with open (filename, ‘w’ ) as file :
file . write («Язык программирования Python»)

Для начала определим название и тип будущего файла и сохраним в переменную filename. Затем при вызове функции open() передадим два аргумента. Первый аргумент содержит имя открываемого файла. Второй аргумент ‘ w ‘ сообщает Python, что файл должен быть открыт в режиме записи. Во второй строчке метод write() используется для записи строки в файл. Открыв файл ‘ memory.txt ‘ вы увидите в нем строку:

Язык программирования Python

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

Важно: Открывая файл в режиме записи ‘ w ‘, если файл уже существует, то Python уничтожит его данные перед возвращением объекта файла.

Файлы можно открывать в режимах:

  • чтение ‘ r ‘
  • запись ‘ w ‘
  • присоединение ‘ a ‘
  • режим как чтения, так и записи ‘ r+ ‘

2.2. Многострочная запись в файл на Python

При использовании функции write() символы новой строки не добавляются в записываемый файл:

with open (filename, ‘w’ ) as file :
file . write («Язык программирования Python»)
file . write («Язык программирования Java»)
file . write («Язык программирования Perl»)

В результате открыв файл мы увидим что все строки склеились:

Язык программирования PythonЯзык программирования JavaЯзык программирования Perl

Для написания каждого сообщения с новой строки используйте символ новой строки \n

with open (filename, ‘w’ ) as file :
file . write («Язык программирования Python \n «)
file . write («Язык программирования Java \n «)
file . write («Язык программирования Perl \n «)

Результат будет выглядеть так:

Язык программирования Python
Язык программирования Java
Язык программирования Perl

2.3. Присоединение данных к файлу на Python

Для добавления новых данных в файл, вместо того чтобы постоянно перезаписывать файл, откройте файл в режиме присоединения ‘ a ‘ . Все новые строки добавятся в конец файла. Возьмем созданный файл из раздела 2.2 ‘memory.txt’. Добавим в него еще пару строк.

with open (filename, ‘a’ ) as file :
file . write («Hello world\n»)
file . write («Полет на луну\n»)

В результате к нашему файлу добавятся две строки:

Язык программирования Python
Язык программирования Java
Язык программирования Perl
Hello world
Полет на луну

3. Исключения в Python

При выполнении программ могут возникать ошибки, для управления ими Python использует специальные объекты, называемые исключениями. Когда в программу включен код обработки исключения, ваша программа продолжится, а если нет, то программа остановится и выведет трассировку с отчетом об исключении. Исключения обрабатываются в блоках try-except . С блоками try-except программы будут работать даже в том случае, если что-то пошло не так.

3.1. Блоки try-except на Python

Приведем пример простой ошибки деления на ноль:

Traceback (most recent call last):
File «example.py», line 1, in
print(7/0)
ZeroDivisionError: division by zero

Если в вашей программе возможно появление ошибки, то вы можете заранее написать блок try-except для обработки данного исключения. Приведем пример обработки ошибки ZeroDivisionError с помощью блока try-except :

try :
print(7/0)
except ZeroDivisionError:
print(«Деление на ноль запрещено»)

Команда print(7/0) помещена в блок try . Если код в блоке try выполняется успешно, то Python пропускает блок except . Если же код в блоке try создал ошибку, то Python ищет блок except и запускает код в этом блоке. В нашем случае в блоке except выводится сообщение «Деление на ноль запрещено». При выполнение этого кода пользователь увидит понятное сообщение:

Деление на ноль запрещено

Если за кодом try-except следует другой код, то Python продолжит выполнение программы.

3.2. Блок try-except-else на Python

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

while True:
first_number = input(«Введите первое число: «)
if first_number == ‘q’:
break
second_number = input(«Введите второе число: «)
if second_number == ‘q’:
break
try :
a = int(first_number) / int(second_number)
except ZeroDivisionError:
print(«Деление на ноль запрещено»)
else :
print(f»Частное двух чисел равно «)

Программа запрашивает у пользователя первое число (first_number), затем второе (second_number). Если пользователь не ввел » q « для завершения работы программа продолжается. В блок try помещаем код, в котором возможно появление ошибки. В случае отсутствия ошибки деления, выполняется код else и Python выводит результат на экран. В случае ошибки ZeroDivisionError выполняется блок except и выводится сообщение о запрете деления на ноль, а программа продолжит свое выполнение. Запустив код получим такие результаты:

Введите первое число: 30
Введите второе число: 5
Частное двух чисел равно 6.0
Введите первое число: 7
Введите второе число: 0
Деление на ноль запрещено
Введите первое число: q

В результате действие программы при появлении ошибки не прервалось.

3.3. Блок try-except с текстовыми файлами на Python

Одна из стандартных проблем при работе с файлами, это отсутствие необходимого файла, или файл находится в другом месте и Python не может его найти. Попробуем прочитать не существующий файл:

with open (filename, encoding=’utf-8′) as file :
contents = file. read()

Так как такого файла не существует, Python выдает исключение:

Traceback (most recent call last):
File «example.py», line 3, in
with open(filename, encoding=’utf-8′) as file:
FileNotFoundError: [Errno 2] No such file or directory: ‘alice_2.txt’

FileNotFoundError — это ошибка отсутствия запрашиваемого файла. С помощью блока try-except обработаем ее:

try :
with open (filename, encoding=’utf-8′) as file :
contents = file. read()
except FileNotFoundError:
print(f»Запрашиваемый файл не найден»)

В результате при отсутствии файла мы получим:

Запрашиваемый файл alice_2.txt не найден

3.4. Ошибки без уведомления пользователя

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

try :
with open (filename, encoding=’utf-8′) as file :
contents = file. read()
except FileNotFoundError:
pass

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

Python: как проверить есть ли какие-либо файлы в директории?

Подскажите пожалуйста, как с помощью Python проверить есть ли в определенной дирректориии какие-либо файлы, не уточняя конкретно какие именно (не указывая ни имен, ни расширений). Интересует просто факт наличия чего-либо или отсутствия. Желательно так, чтобы исполнение скрипта не останавливалось на ошибке, а выдавало лог («файлы присутсвуют»/»отсутствуют»).

  • Вопрос задан более трёх лет назад
  • 5123 просмотра

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

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