Python работа с файловой системой windows

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

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

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

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

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

Для получения текущего рабочего каталога используется os.getcwd():

import os

# вывести текущую директорию
print("Текущая деректория:", os.getcwd())

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Текущая деректория: C:python3bin

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:

# создать пустой каталог (папку)
os.mkdir("folder")

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

Если запустить ее еще раз, будет вызвана ошибка FileExistsError, потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:

# повторный запуск mkdir с тем же именем вызывает FileExistsError, 
# вместо этого запустите:
if not os.path.isdir("folder"):
     os.mkdir("folder")

Функция os.path.isdir() вернет True, если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:

# изменение текущего каталога на 'folder'
os.chdir("folder")

Еще раз выведем рабочий каталог:

# вывод текущей папки
print("Текущая директория изменилась на folder:", os.getcwd())

Вывод:

Текущая директория изменилась на folder: C:python3binfolder

Создание вложенных папок

Предположим, вы хотите создать не только одну папку, но и несколько вложенных:

# вернуться в предыдущую директорию
os.chdir("..")

# сделать несколько вложенных папок
os.makedirs("nested1/nested2/nested3")

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание вложенных папок

Создание файлов

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

# создать новый текстовый файл
text_file = open("text.txt", "w")
# запить текста в этот файл
text_file.write("Это текстовый файл")

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.

# переименовать text.txt на renamed-text.txt
os.rename("text.txt", "renamed-text.txt")

Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.

Перемещение файлов

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

# заменить (переместить) этот файл в другой каталог
os.replace("renamed-text.txt", "folder/renamed-text.txt")

Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем (renamed-text.txt), он будет перезаписан.

Список файлов и директорий

# распечатать все файлы и папки в текущем каталоге
print("Все папки и файлы:", os.listdir())

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

Все папки и файлы: ['folder', 'handling-files', 'nested1', 'text.txt']

А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk():

# распечатать все файлы и папки рекурсивно
for dirpath, dirnames, filenames in os.walk("."):
    # перебрать каталоги
    for dirname in dirnames:
        print("Каталог:", os.path.join(dirpath, dirname))
    # перебрать файлы
    for filename in filenames:
        print("Файл:", os.path.join(dirpath, filename))

os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:

Каталог: .folder
Каталог: .handling-files
Каталог: .nested1
Файл: .text.txt
Файл: .handling-fileslisting_files.py
Файл: .handling-filesREADME.md
Каталог: .nested1nested2
Каталог: .nested1nested2nested3

Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.

Удаление файлов

Удалим созданный файл:

# удалить этот файл
os.remove("folder/renamed-text.txt")

os.remove() удалит файл с указанным именем (не каталог).

Удаление директорий

С помощью функции os.rmdir() можно удалить указанную папку:

# удалить папку
os.rmdir("folder")

Для удаления каталогов рекурсивно необходимо использовать os.removedirs():

# удалить вложенные папки
os.removedirs("nested1/nested2/nested3")

Это удалит только пустые каталоги.

Получение информации о файлах

Для получения информации о файле в ОС используется функция os.stat(), которая выполняет системный вызов stat() по выбранному пути:

open("text.txt", "w").write("Это текстовый файл")

# вывести некоторые данные о файле
print(os.stat("text.txt"))

Вывод:

os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941)

Это вернет кортеж с отдельными метриками. В их числе есть следующие:

    • st_size — размер файла в байтах
    • st_atime — время последнего доступа в секундах (временная метка)
    • st_mtime — время последнего изменения
    • st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных

Для получения конкретного атрибута нужно писать следующим образом:

# например, получить размер файла
print("Размер файла:", os.stat("text.txt").st_size)

Вывод:

Размер файла: 19

На этой странице больше об атрибутах.

Выводы

Работать с файлами и каталогами в Python очень просто. Не имеет значения даже используемая операционная система, хотя отдельные уникальные для системы функции можно использовать: например, os.chown() или os.chmod() в Linux. Более подробно эта тема освещена в официальной документации Python.

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

Содержание

  • Файлы и файловая система

    • Свойства файла

    • Путь к файлу: абсолютный и относительный

    • Операции с файлами

    • Виды файлов

  • Файловый объект в Python

  • Работа с файлами в Python

    • Основные свойства и методы

    • Простое чтение и запись

    • Чтение файла целиком

  • Сериализация и десериализация

    • Модуль pickle

    • Популярные форматы файлов

      • CSV

      • JSON

8.1.1. Файлы и файловая система¶

Файл (англ. File) — именованная область данных на носителе информации.

Файлы хранятся в файловой системе — каталоге, определяющим способ организации, хранения и именования данных, а также задающем ограничения на формат и доступ к данным. На сегодняшний день наиболее популярными являются древовидные каталоги (также директории или папки) — файлы, содержащие записи о входящих в них файлах (Рисунок 8.1.1).

_images/08_01_01.png

Рисунок 8.1.1 — Пример древовидной организации файловой системы в ОС Windows 6.

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

_images/08_01_02.png

Рисунок 8.1.2 — Файловая система предоставляет интерфейс доступа к файлам для операционной системы 7

8.1.1.1. Свойства файла¶

Файл может обладать различным набором свойств в зависимости от файловой системы.

В большинстве файловых систем файл имеет следующие свойства:

  • имя и расширение (как правило, называемые просто именем вместе): например, моя_программа.py;

  • дата/время (могут быть предусмотрены маркеры создания, модификации и последнего доступа);

  • владелец;

  • атрибуты (скрытый, системный и др.) и права доступа.

Имя файла имеет определенные ограничения в зависимости от файловой и операционной системы, в частности, допустимые знаки и длину наименования. Расширение указывается после имени через точку, имея назначение, в основном, для ОС Windows, где определяет приложение для запуска файла.

8.1.1.2. Путь к файлу: абсолютный и относительный¶

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

В операционных системах UNIX разделительным знаком при записи пути является /, в Windows — : эти знаки служат для разделения названия каталогов, составляющих путь к файлу.

Путь может быть:

  • абсолютным (полным): указывает на одно и то же место в файловой системе вне зависимости от текущей рабочей директории или других обстоятельств;

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

Примеры путей для ОС Windows и UNIX:

  • ОС Windows:

    • абсолютный: C:userpythonexample1.py;

    • относительный: example1.py если текущий каталог C:userpython;

    • относительный: pythonexample1.py если текущий каталог C:user;

  • ОС UNIX:

    • абсолютный: /home/user/python/example1.py;

    • относительный: example1.py если текущий каталог /home/user/python/;

    • относительный: user/python/example1.py если текущий каталог /home/.

8.1.1.3. Операции с файлами¶

Все операции с файлами можно подразделить на 2 группы:

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

  • выполняющиеся без его открытия: работа с файлом как элементом файловой системы — переименование, копирование, получение атрибутов и др.

При открытии файла, как правило, указываются:

  • имя файла;

  • права доступа

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

8.1.1.4. Виды файлов¶

По способу организации файлы делятся на файлы с последовательным и произвольным доступом (Рисунок 8.1.3, Таблица 8.1.1).

_images/08_01_03.png

Рисунок 8.1.3 — Файлы с последовательным и произвольным доступом 8

Таблица 8.1.1 — Разница в доступе к файлам с последовательным и произвольным доступом

Характеристика

Последовательный доступ

Произвольный доступ

1

Метафора

_images/08_01_01_i.png

_images/08_01_02_i.png

2

Как хранят информацию?

В неструктурированном виде (текстовом)

В структурированном виде (двоичном)

2

Поиск

Для поиска или обращения к определенному участку в файле необходимо его последовательно прочитать с начала

Разрешен непосредственный переход к любой из записи

3

Можно править в текстовом редакторе?

Да

Нет, необходима специальная программа

4

Плюсы

Компактность

Скорость доступа

5

Основное применение

Файлы конфигурации, документы

Файлы баз данных и их производные

6

Пример

Текстовый файл (*.txt и др.)

База данных (*.mdb и др.)

8.1.2. Файловый объект в Python¶

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

Стандартный способ создания файлового объекта — функция open():

open(file, mode=‘r’, buffering=— 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Открывает файл и возвращает файловый объект. Если файл не может быть открыт, возбуждается исключение OSError и его потомки (FileNotFoundError и др.).

Некоторые из параметров:

Параметры
  • file – путь к файлу (например, строка) или файловый дескриптор;

  • mode

    режим открытия файла:

    Символ

    Описание

    'r'

    Открыть для чтения (по умолчанию)

    'w'

    Открыть для записи (если файл существует, то очищается)

    'x'

    Открыть для создания с эксклюзивными правами (ошибка, если файл существует)

    'a'

    Открыть для добавления (если файл существует)

    '+'

    Открыть для чтения и записи

    't'

    Текстовый режим (по умолчанию)

    'b'

    Двоичный режим

    Двоичный/текстовый режимы могут быть скомбинированы с другими: например, режим 'rb' позволит открыть на чтение бинарный файл;

  • encoding – наименование кодировки, используемой при чтении/записи файла (например, 'utf-8'); параметр имеет смысл только для текстового режима.

Предупреждение

Кодировка файла

При открытии файла Python по умолчанию использует кодировку, предпочитаемую операционной системой. Для определения кодировки по умолчанию выполните код:

import locale
locale.getpreferredencoding(False)  # 'cp1251' на российской сборке ОС Windows

Старайтесь указывать кодировку файла явно, например, encoding="utf-8", особенно если есть вероятность работы программы на различных ОС.

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

class file
close()

Закрывает файл. После этого работа с файлом невозможна (чтение, запись и др.).

Общий цикл работы с файлом может выглядеть следующим образом (Листинг 8.1.1).

Листинг 8.1.1 — Пример цикла работы с файлом | скачать

# При работе с файлами всегда целесообразно использовать исключения

# 1. Стандартный способ открытия файла с обработкой исключений
fh = None
try:
    fh = open("data.txt", encoding="utf-8")
    #
    # Чтение и запись файла
    #
except Exception as e:
    print("Ошибка при работе с файлом:", e)
finally:
    if fh:  # Если файл не открылся, значит 'fh' == None и закрывать его не нужно
        fh.close()

# 2. Для упрощения кода по выделению и высвобождению ресурсов в Python
#    предусмотрены специальные объекты - менеджеры контекста,
#    которые могут самостоятельно следить за использованием ресурсов
#
#    Наиболее часто менеджеры контекста вызываются с использованием ключевого слова with

try:
    with open("data2.txt", encoding="utf-8") as fh:
        #
        # Чтение и запись файла
        #
except Exception as e:
    print("Ошибка при работе с файлом:", e)

Примечание

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

При самостоятельном написании программ не следует забывать добавлять обработку исключений — программа должна адекватно реагировать на возможные нестандартные ситуации (используемые файлы может изменить пользователь или другая программа).

8.1.3. Работа с файлами в Python¶

8.1.3.1. Основные свойства и методы¶

Файловый объект предоставляет ряд свойств и методов для работы с файлами. Большинство методов универсально и предполагают работу (чтение/запись) со строками в указанной кодировке (str для текстовых файлов) или с набором байт (bytes для двоичных файлов).

class file
name

Имя файла (если имеется).

mode

Режим, в котором был открыт файл.

encoding

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

closed

Возвращает True, если файл закрыт.

close()

Закрывает файл. После этого работа с файлом невозможна (чтение, запись и др.).

read(count)

Читает до count байт из файлового объекта. Если значение count не определено, то читаются все байты, начиная от текущей позиции и до конца.

Если ничего не было прочитано (конец файла), возвращается пустой объект str или bytes.

readinto(ba)

Читает до len(ba) байт в объект ba типа bytearray и возвращает число прочитанных байт (0, если был достигнут конец файла).

Доступен только в двоичном режиме.

readline(count)

Читает следующую строку (до count байт, если значение count определено и число прочитанных байтов было достигнуто раньше, чем встретился символ перевода строки 'n'), включая символ перевода строки 'n'.

readlines(sizehint)

Читает все строки до конца файла и возвращает их в виде списка.

Если значение аргумента sizehint определено, то будет прочитано примерно sizehint байт (если файл поддерживает такую возможность).

write(s)

Записывает в файл объект s типа:

  • str для текстового режима;

  • bytes / bytearray для двоичного режима.

Примечание

Запись в файл возможна и с помощью стандартной функции print(), установив ключевой параметр file в открытый файловый объект.

writelines(seg)

Записывает в файл последовательность объектов типа:

  • str для текстового режима;

  • bytes / bytearray для двоичного режима.

flush()

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

Метод flush() вызывает принудительное очистку буфера. В большинстве случаев вызывать его напрямую не нужно.

close()

Закрывает файл. После этого работа с файлом невозможна (чтение, запись и др.).

8.1.3.2. Простое чтение и запись¶

В Листинге 8.1.2 приведен пример работы с двоичным файлом.

Листинг 8.1.2 — Пример работы с двоичным файлом | скачать

human = dict(name="Михаил Толстых", age=35, weight=90.5)
filename = "08_01_02_data.txt"

# 1. Запись в файл
#    При записи бинарных файлов все данные должны быть преобразованы в тип bytes
#    Удобно выполнить преобразование через метод str.encode()
fh = None
try:
    fh = open(filename, "wb")
    fh.write(bytes(human["name"].encode("utf-8")))
    fh.write(bytes(str(human["age"]).encode("utf-8")))
    fh.write(bytes(str(human["weight"]).encode("utf-8")))
finally:
    if fh:
        fh.close()

# 2. Чтение из файла
#    При чтении бинарных файлов необходимо точно знать, сколько байт
#    прочитать и как их декодировать, используя bytes.decode()
#    При редактировании файла в стороннем редакторе файл может быть не читаем
fh = None
try:
    fh = open(filename, "rb")
    name = fh.read(27).decode("utf-8")
    age = int(fh.read(2).decode("utf-8"))
    weight = float(fh.read(4).decode("utf-8"))
    print(name, age, weight)  # Михаил Толстых 35 90.5
finally:
    if fh:
        fh.close()

В Листинге 8.1.3 приведен пример работы с текстовым файлом.

Листинг 8.1.3 — Пример работы с текстовым файлом | скачать

human = dict(name="Михаил Толстых", age=35, weight=90.5)
filename = "08_01_03_data.txt"

# 1. Запись в файл
#    При записи текстовых файлов все данные должны быть преобразованы в тип str
#    По умолчанию, write() не добавляет перенос строки, однако его можно добавить самостоятельно
fh = None
try:
    fh = open(filename, "w", encoding="utf-8")
    # При добавлении переноса записываемые данные будут на отдельной строке
    fh.write(human["name"] + "n")
    fh.write(str(human["age"]) + "n")
    # Как альтернатива - print() позволяет не переводить в строку и не добавлять перенос вручную
    print(human["weight"], file=fh)
finally:
    if fh:
        fh.close()

# 2. Чтение из файла
#    Для чтения отдельной строки достаточно вызвать метод readline().
#    В конце полученной строки знак переноса - n,
#    который можно убрать, например, методом str.strip()
fh = None
try:
    fh = open(filename, encoding="utf-8")
    # Читаем первые 3 строки и преобразуем при необходимости
    name = fh.readline().strip()
    age = int(fh.readline())
    weight = float(fh.readline())
    print(name, age, weight)  # Михаил Толстых 35 90.5
finally:
    if fh:
        fh.close()

8.1.3.3. Чтение файла целиком¶

Чтение файла, приведенное в Листинге 8.1.3 не подразумевает, что содержимое файла может меняться.

Учитывать такие изменения можно, прочитав файл целиком:

  • в одну строку;

  • в список строк;

  • построчно, пока не достигнут конец файла.

Примеры реализации данных вариантов приведены в Листинге 8.1.4 на примере файла 08_01_04_data.txt:

Содержимое файла 08_01_04_data.txt | скачать

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

Брайан Грин
https://ru.wikipedia.org/wiki/Грин,_Брайан_Рэндолф

Листинг 8.1.4 — Различные способы чтения текстового файла целиком | скачать

filename = "08_01_04_data.txt"

# В данном примере обработка исключений не приводится, чтобы
# сосредоточить внимание на чтении файлов 

# 1. Чтение из файла (в одну строку)
with open(filename, encoding="utf-8") as fh:
    data = fh.read()
    print(data)

# 2. Чтение из файла (в список)
with open(filename, encoding="utf-8") as fh:
    data = fh.readlines()
    print(data)

# ['Когда дети будут смотреть на великих учёных так же,n',
#  'как они смотрят на знаменитых актёров и музыкантов,n',
#  'человечество совершит большой прорыв.n',
#  'n',
#  'Брайан Гринn',
#  'https://ru.wikipedia.org/wiki/Грин,_Брайан_Рэндолфn']

# 3. Чтение из файла (построчно)
with open(filename, encoding="utf-8") as fh:
    for line in fh:
        print(line.strip())

8.1.4. Сериализация и десериализация¶

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

Сериализация — процесс перевода какой-либо структуры данных в последовательность битов. Десериализация — обратный процесс.

Чаще всего сериализация используется для сохранения объектов в файлы или передачи их по сети.

8.1.4.1. Модуль pickle

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

Основные функции модуля:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

Сериализует объект obj и записывает его в файл file.

Некоторые из параметров:

Параметры
  • obj – объект для записи;

  • file – файловый объект;

  • protocol – версия формата pickle.

pickle.load(file, *, fix_imports=True, encoding=‘ASCII’, errors=‘strict’)

Читает и десериализует содержимое файла file, возвращая созданный объект (структуру).

Некоторые из параметров:

Параметры

file – файловый объект.

Пример работы с модулем pickle приведен в Листинге 8.1.5.

Листинг 8.1.5 — Использование pickle для загрузки/сохранения объектов Python | скачать

import pickle

filename = "08_01_05_data.txt"
# список покупок
shoplist = {"фрукты": ["яблоки", "манго"],
            "овощи": ["морковь"],
            "бюджет": 1000}

# Запись в файл
with open(filename, "wb") as fh:
    pickle.dump(shoplist, fh)  # помещаем объект в файл

# Считываем из хранилища
shoplist_2 = []
with open(filename, "rb") as fh:
    shoplist_2 = pickle.load(fh)  # загружаем объект из файла
print(shoplist_2)  # {'бюджет': 1000, 'овощи': ['морковь'], 'фрукты': ['яблоки', 'манго']}

Формат файла, создаваемого pickle, приведен на Рисунке 8.1.4.

_images/08_01_04.png

Рисунок 8.1.4 — Содержимое файла с данными при использовании pickle (в редакторе Notepad++)

Минусы формата pickle:

  • специфичен для Python (не может быть использован, если файл будет читаться с использованием других языков программирования);

  • небезопасен (десериализация готовых конструкций языка может привести к выполнению ненадежного кода).

8.1.4.2. Популярные форматы файлов¶

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

Среди них одними из наиболее популярных являются:

  • CSV (англ. Comma-Separated Values — значения, разделенные запятыми);

  • JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript;

  • XML (англ. eXtensible Markup Language — расширяемый язык разметки);

  • YAML (англ. YAML Ain’t Markup Language — «YAML — Не язык разметки»);

  • INI (англ. Initialization file — файл инициализации);

  • и др.

Подавляющее большинство форматов поддерживается Python (стандартными или сторонними модулями и пакетами).

8.1.4.2.1. CSV¶

CSV (англ. Comma-Separated Values — значения, разделенные запятыми, 2005 г.) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы, где значения отдельных колонок разделяются разделительным символом (англ. delimiter) запятой , и заключаются в кавычки " (Рисунок 8.1.5).

_images/08_01_05.png

Несмотря на наличие стандарта (RFC 4180), на сегодняшний день под CSV, как правило, понимают набор значений, разделенных произвольными разделителями, в произвольной кодировке с произвольными окончаниями строк. Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту реализации поддержки CSV (так, например, Microsoft Excel не всегда открывает стандартные разделенные запятыми данные).

В Python работа с CSV-файлами поддерживается стандартным модулем csv, предоставляющем следующие основные объекты и функции:

csv.reader(csvfile, dialect=‘excel’, **fmtparams)

Создает и возвращает объект для чтения последовательности из CSV-файла.

Некоторые из параметров:

Параметры
  • csvfile – итерируемый объект, возвращающий строку на каждой итерации (например, файловый объект в текстовом режиме доступа);

  • dialect – диалект CSV (набор специальных параметров);

  • fmtparams – дополнительные настройки (совокупность кавычек, разделителей и т.д.).

csv.writer(csvfile, dialect=‘excel’, **fmtparams)

Создает и возвращает объект для записи последовательности в CSV-файл.

Некоторые из параметров:

Параметры
  • csvfile – любой объект, поддерживающий метод записи write();

  • dialect – аналогично csv.reader();

  • fmtparams – аналогично csv.reader().

class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect=‘excel’, *args, **kwds)

Создает и возвращает объект для чтения данных из CSV-файла как словаря значений.

Некоторые из параметров:

Параметры
  • csvfile – итерируемый объект, возвращающий строку на каждой итерации (например, файловый объект в текстовом режиме доступа);

  • fieldnames – список наименований столбцов (если не задан, используется первая строка файла).

class csv.DictWriter(csvfile, fieldnames, restval=», extrasaction=‘raise’, dialect=‘excel’, *args, **kwds)

Создает и возвращает объект для записи данных как словаря значений в CSV-файл.

Некоторые из параметров:

Параметры
  • csvfile – любой объект, поддерживающий метод записи write();

  • fieldnames – список наименований столбцов.

class csv.Writer
writerow(row)

Записывает последовательность row в CSV-файл.

writerows(rows)

Записывает список последовательностей rows в CSV-файл.

class csv.DictWriter

Записывает в файл заголовки файла, переданные при создании класса.

writerow(row)

Записывает словарь row в CSV-файл.

writerows(rows)

Записывает список словарей rows в CSV-файл.

exception csv.Error

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

Пример использования модуля csv приведен в Листинге 8.1.6 (а-б).

Листинг 8.1.6 (а) — Работа с CSV-файлом в Python (последовательность) | скачать

import csv

filename = "08_01_06_a_data.csv"
# список покупок
shoplist = {"яблоки": [2, 100], "манго": [3, 250], "морковь": [1, 35]}

# Запись в файл
with open(filename, "w", encoding="utf-8", newline="") as fh:
    writer = csv.writer(fh, quoting=csv.QUOTE_ALL)
    writer.writerow(["Наименование", "Вес", "Цена/кг."])  # Заголовки столбца
    for name, values in sorted(shoplist.items()):
        writer.writerow([name, *values])
    writer.writerow(["рис", "4", "70"])  # Допишем произвольную запись

# Содержимое файла
#
# "Наименование","Вес","Цена/кг."
# "манго","3","250"
# "морковь","1","35"
# "яблоки","2","100"
# "рис","4","70"

# Чтение файла
rows = []
with open(filename, "r", encoding="utf-8") as fh:
    reader = csv.reader(fh)
    rows = list(reader)  # reader - итерируемый объект и может быть преобразован в список строк

for row in rows:
    print(row)

# Вывод на экран
#
# ['Наименование', 'Вес', 'Цена/кг.']
# ['манго', '3', '250']
# ['морковь', '1', '35']
# ['яблоки', '2', '100']
# ['рис', '4', '70']

Листинг 8.1.6 (б) — Работа с CSV-файлом в Python (словарь) | скачать

import csv

filename = "08_01_06_b_data.csv"
# список покупок
shoplist = {"яблоки": [2, 100], "манго": [3, 250], "морковь": [1, 35]}

# Запись в файл
with open(filename, "w", encoding="utf-8", newline="") as fh:
    writer = csv.DictWriter(fh, fieldnames=["name", "weight", "price"], quoting=csv.QUOTE_ALL)
    writer.writeheader()  # Записывает заголовки в файл
    for name, values in sorted(shoplist.items()):
        writer.writerow(dict(name=name, weight=values[0], price=values[1]))

# Содержимое файла
#
# "name","weight","price"
# "манго","3","250"
# "морковь","1","35"
# "яблоки","2","100"

# Чтение файла
rows = []
with open(filename, "r", encoding="utf-8") as fh:
    reader = csv.DictReader(fh)
    rows = list(reader)  # reader - итерируемый объект и может быть преобразован в список строк

for row in rows:
    print(row)

# Вывод на экран
#
# {'name': 'манго', 'weight': '3', 'price': '250'}
# {'name': 'морковь', 'weight': '1', 'price': '35'}
# {'name': 'яблоки', 'weight': '2', 'price': '100'}

8.1.4.2.2. JSON¶

JSON (англ. JavaScript Object Notation, 1999 г.) — текстовый формат обмена данными, основанный на JavaScript. Одно из преимуществ — JSON легко читается людьми (англ. human-readable) (Листинг 8.1.7).

Листинг 8.1.7 — Пример JSON-файла | скачать

{
	"ФИО": "Иванов Сергей Михайлович",
	"ЕГЭ": {
		"Математика": 90,
		"Физика": 70,
		"Информатика": 80
	},
	"Хобби": ["Рисование", "Плавание"],
	"Возраст": 25.5,
	"ДомЖивотные": null
}

JSON-текст представляет собой одну из двух структур:

  • набор пар ключ: значение (словарь в терминологии Python), где ключ — строка, значение — любой тип;

  • упорядоченный набор значений (список в терминологии Python).

Значением может являться:

  • строка (в кавычках);

  • число;

  • логическое значение (true/false);

  • null;

  • одна из структур.

Одним из преимуществ JSON является близкое соответствие Python по типам данных. Работа с JSON-форматом поддерживается стандартным пакетом json, предоставляющем следующие основные функции:

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

Сериализует объект obj, возвращая строку в JSON-формате.

Некоторые из параметров:

Параметры
  • obj – сериализуемый объект;

  • ensure_ascii – если равен False, запись не-ASCII значений происходит в файл «как есть», без преобразования в Unicode;

  • indent – величина отступа для вложенных структур.

json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Десериализует объект (в том числе файловый) s, возвращая структуру в Python.

При ошибке десериализации возбуждается исключение JSONDecodeError.

exception json.JSONDecodeError(msg, doc, pos, end=None)

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

Пример работы с JSON-форматом приведен в Листинге 8.1.8.

Листинг 8.1.8 — Работа с JSON-форматом в Python | скачать

import json

filename = "08_01_08_data.json"

info = {
    "ФИО": "Иванов Сергей Михайлович",
    "ЕГЭ": {
        "Математика": 90,
        "Физика": 70,
        "Информатика": 80
    },
    "Хобби": ["Рисование", "Плавание"],
    "Возраст": 25.5,
    "ДомЖивотные": None
}

# Запись структуры в файл в JSON-формате
with open(filename, "w", encoding="utf-8") as fh:
    fh.write(json.dumps(info, ensure_ascii=False, indent=4))

# Пример содержимого файла:
# {
#     "Хобби": [
#         "Рисование",
#         "Плавание"
#     ],
#     "ЕГЭ": {
#         "Информатика": 80,
#         "Математика": 90,
#         "Физика": 70
#     },
#     "ФИО": "Иванов Сергей Михайлович",
#     "ДомЖивотные": null,
#     "Возраст": 25.5
# }

# Чтение из файла JSON-формата
info_2 = []
with open(filename, encoding="utf-8") as fh:
    info_2 = json.loads(fh.read())

print(info_2)
# {'ФИО': 'Иванов Сергей Михайлович', 'ЕГЭ': {'Информатика': 80, 'Математика': 90, 'Физика': 70},
#  'Хобби': ['Рисование', 'Плавание'], 'Возраст': 25.5, 'ДомЖивотные': None}

Примечание

Валидация и оформление JSON-файлов

При возникновении ошибки чтения файла JSON-формата рекомендуется проверить его синтаксис с использованием специальных онлайн-сервисов, например, https://jsonformatter.curiousconcept.com/, которые могут как указать место ошибки, так и оформить его по стандарту.


1

Sebesta, W.S Concepts of Programming languages. 10E; ISBN 978-0133943023.

2

Python — официальный сайт. URL: https://www.python.org/.

3

Python — FAQ. URL: https://docs.python.org/3/faq/programming.html.

4

Саммерфилд М. Программирование на Python 3. Подробное руководство. — М.: Символ-Плюс, 2009. — 608 с.: ISBN: 978-5-93286-161-5.

5

Лучано Рамальо. Python. К вершинам мастерства. — М.: ДМК Пресс , 2016. — 768 с.: ISBN: 978-5-97060-384-0, 978-1-491-94600-8.

6

Что такое папка. URL: http://beginpc.ru/windows/chto-takoe-folder.

7

The Volume Does Not Contain A Recognized File System – How To Fix. URL: https://www.powerdatarecovery.com/hard-drive-recovery/volume-not-contain-recognized-file-system.html.

8

Последовательный доступ. URL: https://ru.wikipedia.org/wiki/Последовательный_доступ.

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

Что такое модуль os?

Модуль os в Python — это библиотека функций для работы с операционной системой. Методы, включенные в неё позволяют определять тип операционной системы, получать доступ к переменным окружения, управлять директориями и файлами:

  • проверка существования объекта по заданному пути;
  • определение размера в байтах;
  • удаление;
  • переименование и др.

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

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

Рекомендуется использовать эту инструкцию в начале файла с исходным кодом.

Функции модуля os

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

Получение информации об ОС

Чтобы узнать имя текущей ОС, достаточно воспользоваться методом name. В зависимости от установленной платформы, он вернет ее короткое наименование в строковом представлении. Следующая программа была запущена на ПК с ОС Windows 10, поэтому результатом работы функции name является строка nt. Увидеть это можно при помощи обычного метода print.

import os
print(os.name)

nt

Получить сведения, которые касаются конфигурации компьютера, можно при помощи метода environ. Вызвав его через обращение к библиотеке os, пользователь получает большой словарь с переменными окружения, который выводится в консоль или строковую переменную. Таким образом, можно узнать название системного диска, адрес домашней директории, имя системы и массу другой информации. Следующий пример демонстрирует применение environ.

import os
print(os.environ)

environ({'ALLUSERSPROFILE': 'C:\ProgramData', …})

При помощи функции getenv можно получить доступ к различным переменным среды. Чтобы сделать это, достаточно передать в качестве аргумента необходимое название переменной, как в следующем примере, где print выводит на экран сведения о TMP на дисплей в консоль.

import os
print(os.getenv("TMP"))

C:UsersadminAppDataLocalTemp

Изменение рабочей директории

По умолчанию рабочей директорией программы является каталог, где содержится документ с ее исходным кодом. Благодаря этому, можно не указывать абсолютный путь к файлу, если тот находится именно в этой папке. Получить сведения о текущей директории позволяет функция getcwd, которая возвращает полный адрес рабочего каталога на жестком диске. В следующем фрагменте кода показано что будет, если передать результат работы этого метода в print. Как можно заметить, рабочей директорией является каталог program на системном диске C.

import os
print(os.getcwd())

C:Usersadminsourcereposprogram

При желании, рабочую директорию можно настроить по своему усмотрению, применив метод chdir из библиотеки os. Для этого необходимо передать ему в качестве параметра абсолютный адрес к новому каталогу. Если указанного пути на самом деле не существует, программа будет завершена в аварийном режиме из-за выброшенного исключения. В следующем примере кода продемонстрирован переход к новой рабочей директории под названием folder на диске D.

import os
os.chdir(r"D:folder")

D:folder

Проверка существования пути

Чтобы избежать ошибок, связанных с отсутствием определенного файла или директории, которые должны быть обработаны программой, следует предварительно проверять их наличие с помощью метода exists. Передав ему в качестве аргумента путь к нужному файлу или папке, можно рассчитывать на лаконичный ответ в виде булевого значения true/false, сообщающего о наличии/отсутствии указанного объекта в памяти компьютера. В следующем примере идет проверка текстового файла test.txt из корневого каталога D, которая возвращает True.

import os
print(os.path.exists("D:/test.txt"))

True

Если объект на диске реально существует, это не всегда значит, что он имеет подходящую для дальнейшей обработки форму. Проверить, является ли определенный объект файлом, поможет функция isfile, которая принимает его адрес. Ознакомиться с результатом его работы можно из следующего примера, где print отображает на экране значение True для файла test.txt.

import os
print(os.path.isfile("D:/test.txt"))

True

Аналогичные действия можно выполнить и для проверки объекта на принадлежность к классу директорий, вызвав для его адреса метод isdir из библиотеки os. Как можно заметить, в данном случае print выводит на экран булево значение False, поскольку test.txt не является папкой.

import os
print(os.path.isdir("D:/test.txt"))

False

Создание директорий

Возможности модуля os позволяют не только отображать информацию об уже существующих в памяти объектах, но и генерировать абсолютно новые. Например, с помощью метода mkdir довольно легко создать папку, просто указав для нее желаемый путь. В следующем примере в корневом каталоге диска D производится новая папка под названием folder через mkdir.

import os
os.mkdir(r"D:folder")

Однако на этом возможности по генерации директорий не заканчиваются. Благодаря функции makedirs можно создавать сразу несколько новых папок в неограниченном количестве, если предыдущая директория является родительской для следующей. Таким образом, в следующем примере показывается генерация целой цепочки папок из folder, first, second и third.

import os
os.makedirs(r"D:folderfirstsecondthird")

Удаление файлов и директорий

Избавиться от ненужного в дальнейшей работе файла можно с помощью метода remove, отдав ему в качестве аргумента абсолютный либо относительный путь к объекту. В небольшом коде ниже демонстрируется удаление документа test.txt из корневой директории диска D на ПК.

import os
os.remove(r"D:test.txt")

Чтобы стереть из памяти папку, следует воспользоваться встроенной функцией rmdir, указав ей адрес объекта. Однако здесь присутствуют определенные нюансы, поскольку программа не позволит беспрепятственно удалить директорию, в которой хранятся другие объекты. В таком случае на экране отобразится ошибка и будет выброшено исключение. В следующем примере производится процедура удаления пустой директории folder при помощи метода rmdir.

import os
os.rmdir(r"D:folder")

Для быстрого удаления множества пустых папок следует вызывать функцию removedirs. Она предоставляет возможность избавиться сразу от нескольких каталогов на диске, при условии, что все они вложены друг в друга. Таким образом, указав путь к конечной папке, можно легко удалить все родительские директории, но только если они в результате оказываются пустыми. В примере показано мгновенное удаление четырех разных папок: folder, first, second, third.

import os
os.removedirs(r"D:folderfirstsecondthird")

Запуск на исполнение

Встроенные функции библиотеки os позволяют запускать отдельные файлы и папки прямиком из программы. С этой задачей прекрасно справляется метод startfile, которому стоит передать адрес необходимо объекта. Программное обеспечение, используемое для открытия документа, определяется средой автоматически. Например, при запуске обычного файла test.txt, как это сделано в следующем примере, задействуется стандартный блокнот. Если передать функции ссылку на директорию, она будет открыта при помощи встроенного менеджера файлов.

import os
os.startfile(r"D:test.txt")

Получение имени файла и директории

Иногда для взаимодействия с документом необходимо получить его полное имя, включающее разрешение, но не абсолютный путь к нему на диске. Преобразовать адрес объекта в название позволяет функция basename, которая содержится в подмодуле path из библиотеки os. Таким образом, следующий пример показывает преобразование пути test.txt в простое имя файла.

import os
print(os.path.basename("D:/test.txt"))

test.txt

Обратная ситуация возникает тогда, когда пользователю нужно получить только путь к файлу, без самого названия объекта. Это поможет сделать метод dirname, который возвращает путь к заданному документу в строковом представлении, как это продемонстрировано в небольшом примере ниже. Здесь print выводит на экран адрес текстового документа в папке folder.

import os
print(os.path.dirname("D:/folder/test.txt"))

D:/folder

Вычисление размера

Чтобы определить размер документа или папки, стоит воспользоваться функцией getsize, как это показано в следующем примере для файла test.txt. Функция print выводит размер данного документа в байтах. Воспользоваться getsize можно и для измерения объема директорий.

import os
print(os.path.getsize("D:\test.txt"))

136226

Переименование

Библиотека os предоставляет возможность быстрой смены названия для любого файла или же каталога при помощи метода rename. Данная функция принимает сразу два разных аргумента. Первый отвечает за путь к старому наименованию документа, в то время как второй отвечает за его новое название. В примере показано переименование директории folder в catalog. Стоит помнить, что метод может генерировать исключение, если по указанному пути нет файла.

import os
os.rename(r"D:folder", r"D:catalog")

Переименовывать можно не только один каталог, но и несколько папок сразу, только если все они находятся в одной иерархической цепочке. Для этого достаточно вызвать метод renames и передать ему путь к конечной директории в качестве первого аргумента. В роли же второго параметра выступает аналогичный адрес к папке, но только с новыми именами всей цепочки. Следующий пример демонстрирует правильное использование функции renames, за счет чего было произведено переименование директорий folder, first и second в catalog, one и two.

import os
os.renames(r"D:folderfirstsecond", r"D:catalogonetwo")

Содержимое директорий

Проверить наличие в каталоге определенных объектов позволяет функция listdir. С её помощью можно получить информацию о файлах и папках в виде списка. В программе немного ниже показано, как метод принимает в качестве параметра путь к каталогу folder на диске D, а затем выводит название внутренней папки first и документа test.txt, вывод в консоль осуществляется с помощью print.

import os
print(os.listdir(r"D:folder"))

['first', 'test.txt']

Воспользовавшись методом walk, можно получить доступ к названиям и путям всех подпапок и файлов, относящихся к заданному каталогу. Применив один внешний цикл for, а также два вложенных, несложно получить информацию об объектах в каталоге folder через специальные списки directories и files. Сведения выдаются с помощью многократного обращения к print.

import os
for root, directories, files in os.walk(r"D:folder"):
    print(root)
    for directory in directories:
        print(directory)
    for file in files:
        print(file)

D:folder
first
D:folderfirst
second
D:folderfirstsecond
third
D:folderfirstsecondthird
test.txt

Информация о файлах и директориях

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

import os
print(os.stat(r"D:test.txt"))

os.stat_result(st_mode=33206, …)

Обработка путей

Возвращаясь к классу path из библиотеки os, стоит принять во внимание функцию split, позволяющую очень легко разъединять путь к файлу и имя файла в различные строки. Это демонстрируется на следующем примере с текстовым документом test.txt в папке folder.

import os
print(os.path.split(r"D:foldertest.txt"))

('D:\folder', 'test.txt')

Обратное действие выполняет функция join, позволяя легко соединить путь к документу с его названием. Как видно из результатов работы данного кода, благодаря print на экране будет отображаться путь, который ссылается на текстовый файл test.txt в каталоге folder на D.

import os
print(os.path.join(r"D:folder", "test.txt"))

D:foldertest.txt

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

Понравилась статья? Поделить с друзьями:
  • Python работа с буфером обмена windows
  • Python программа для windows скачать бесплатно
  • Python приложение для windows в трее
  • Python переместить файл в другую папку windows
  • Python переключиться на другое окно windows