Баннер мобильный (1) Пройти тест

Как работать с файлами в Python

Разбираем, как открывать, читать и записывать файлы на Python c примерами кода

Инструкция

12 апреля 2024

Поделиться

Скопировано
Как работать с файлами в Python

Содержание

    Программа на Python — это не только функционал, но и оптимальная система работы с файлами. Например, если вы пишете чат-бот, вам нужно загрузить в него готовые ответы в файле txt. Если вы сделали программу для обработки фото — здесь ваш код на Python должен быть готов обрабатывать файлы, которые загрузит в сервис пользователь.

    В этой статье разберемся, как работать с файлами на Python, какие для этого есть библиотеки и методы. 

    Что такое файл

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

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

    • открытие;
    • операции чтения из файла и записи в файл;
    • закрытие.

    Разберемся со всеми действиями по порядку.

    Открытие файла на чтение и запись в Python

    На компьютере файл надо открыть перед тем, как вносить в него изменения. Такое же правила действует и для Python: нужно открыть файл на чтение и запись. Без этапа открытия нельзя читать содержимое или изменять его. Открыть файл можно с помощью функции open():

    open(file, mode='rt')

    В функцию в качестве аргументов требуется передать путь файлу (file) и выбрать режим работы (mode). По умолчанию Python выбирает значение rt, но доступны и другие режимы:

    Аргумент mode
    Как работает
    r
    Чтение из файла 
    t
    Открыть как текстовый файл
    w
    Запись в файл и создание файла, если его не существует
    x
    Запись в файл и вызовы исключения, если файла не существует
    b
    Открыть как двоичный файл
    a
    Запись в файл путем добавления новых значений в конец
    +
    Работа в режиме чтения и записи

    Можно комбинировать режимы и использовать сразу несколько. К примеру, по умолчанию функция open() принимает аргумент rt. Это значит, что файл будет открыт в виде текстового документа для чтения. С помощью r+ и w+ можно открыть файл сразу для чтения и записи на Python. В первом случае несуществующие файлы будут создаваться, а во втором такое действие спровоцирует вызов исключения.

    Если в Python надо открыть файл data.txt в виде текстового документа с правами для чтения, то для этого следует использовать следующий код:

    f = open('data.txt')

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

    f = open('data.txt', 'w+')

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

    f = open('data.txt', 'w+')
    # действия с файлом
    f.close()

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

    with open('data.txt', 'w+') as f:
    # действия с файлом

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

    with open('data.txt', 'w+', encoding='utf-8') as f:
    # действия с файлом

    Кодировку можно указать третьим параметром и при обычном способе открытия:

    f = open('data.txt', 'w+', encoding='utf-8')
    # действия с файлом
    f.close()

    Чтение файла

    Чтение из файла Python можно реализовать с помощью функции read(), если он открыт в режиме чтения r. Синтаксис функции выглядит следующим образом:

    file.read(size)

    В строке выше file обозначает объект, с которым работаем, а size — количество символов для чтения. Если ничего не указать в качестве аргумента функции read(), то получится прочитать сразу все содержимое документа.

    Для примера: создадим в проекте file.txt и запишем в него строку «Привет, Python!». Теперь прочитаем первые шесть символов из файла:

    with open('file.txt', 'r', encoding='utf-8') as f:
        data = f.read(6)
    print(data)

    Если запустить код, то Python выведет в консоль фразу «Привет» — это и есть первые шесть символов строки «Привет, Python!» в file.txt:

    >>> Привет

    Теперь отредактируем код. В этом примере не будем передавать никакие аргументы в функцию read():

    with open('file.txt', 'r', encoding='utf-8') as f:
        data = f.read()
    print(data)
    
    >>> Привет, Python!

    В этом случае система выводит сразу все содержимое файла.

    Содержимое файла можно считывать построчно. Убедимся в этом, отредактировав file.txt. Добавим в него список продуктов:

    Морковь
    Сметана
    Мука
    Яблоки

    Теперь прочитаем этот список с помощью функции readline():

    with open('file.txt', 'r', encoding='utf-8') as f:
        print(f.readline())
    
    >>> Морковь

    Python прочитал первую строку списка продуктов. Если вызвать функцию readline() несколько раз, то получится прочитать последующие строки файла:

    with open('file.txt', 'r', encoding='utf-8') as f:
        print(f.readline())
        print(f.readline())
        print(f.readline())
        print(f.readline())
    
    >>> Морковь
    >>> Сметана
    >>> Мука
    >>> Яблоки

    Более удобно последовательное чтение с помощью readline() можно реализовать в цикле:

    with open('file.txt', 'r', encoding='utf-8') as f:
        for line in f:
            print(line)
    
    >>> Морковь
    >>> Сметана
    >>> Мука
    >>> Яблоки

    Все строки файла можно прочитать с помощью метода readlines(), возвращающего содержимое в виде списка вместе со специальными символами:

    with open('file.txt', 'r', encoding='utf-8') as f:
        data = f.readlines()
    print(data)
    
    >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

    Такое чтение можно реализовать и без метода readlines(), воспользовавшись конструктором списков list():

    with open('file.txt', 'r', encoding='utf-8') as f:
        data = list(f)
    print(data)
    
    >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']

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

    Запись в файл на Python

    Для записи файла в Python используется функция write(). В качестве аргумента ей следует передать строку, содержимое которой будет записано:

    file.write(string)

    Удалим все содержимое file.txt и запишем в него строку «Привет, Python!»:

    with open('file.txt', 'a', encoding='utf-8') as f:
        data = 'Привет, Python!'
        f.write(data)

    Обратите внимание, что в этом примере мы открыли файл в режиме a, что позволяет записывать новые строки в конец. Выполняем код, открываем файл — теперь в нем содержится строка «Привет, Python!».

    В файл можно записать сразу список строк. Для этого применяется метод writelines(), которому в качестве аргумента надо передать сам список. В качестве примера создадим переменную со списком продуктов и запишем ее в file.txt:

    with open('file.txt', 'a', encoding='utf-8') as f:
        grocery = ['Морковь', 'Яблоки', 'Мука', 'Молоко']
        f.writelines(grocery)

    Если выполнить код и проверить file.txt, то мы увидим единую строку без пробелов. Все дело в том, что метод writelines() не добавляет разделители строк автоматически. Нужно сделать это вручную, прописав \n каждому элементу списка:

    with open('file.txt', 'a', encoding='utf-8') as f:
        grocery = ['Морковь\n', 'Яблоки\n', 'Мука\n', 'Молоко\n']
        f.writelines(grocery)

    Теперь при выполнении кода каждый элемент списка будет записываться на новую строку.

    Управление указателем

    В Python есть возможность явно задать позицию указателя в файле — для этого используется метод seek(). Узнать текущую позицию можно с помощью метода tell().

    Рассмотрим принципы работы с методами на примере. Откроем file.txt в режиме доступа r+ и запишем в него строку «0123456789ABCDEF»:

    with open('file.txt', 'r+', encoding='utf-8') as f:
        f.write('0123456789ABCDEF')

    Теперь прочитаем седьмой символ в строке. Для этого воспользуемся методом seek() для перемещения указателя. В качестве аргумента надо передать функции аргумент смещения в байтах. Вспомним, что нумерация строк начинается с нуля, а нам надо прочитать седьмой символ строки. Значит, укажем смещение в шесть байтов:

    with open('file.txt', 'r+', encoding='utf-8') as f:
        f.write('123456789ABCDEF')
        f.seek(5)
        data = f.read(1)
    print(data)
    
    >>> 6

    Можно осуществить смещение с конца, тогда в качестве второго элемента надо передать отправную точку для формирования смещения. Всего доступны три начальные позиции:

    • 0 — от начала файла;
    • 1 — от текущей позиции;
    • 2 — от конца файла.

    Теперь прочитаем четвертый символ с конца строки:

    with open('file.txt', 'r+b') as f:
        f.seek(-4, 2)
        data = f.read(1)
    print(data)
    >>> b'C'

    Узнать байт позиции указателя можно с помощью метода tell():

    with open('file.txt', 'r+', encoding='utf-8') as f:
        f.write('123456789ABCDEF')
        f.read(5)
        print(f.tell())

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

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

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

    import os

    Теперь узнаем с помощью Python текущий каталог. Делаем это с помощью метода getcwd(). В выводе метода получим путь к папке, в которой сейчас находимся:

    import os
    
    print(os.getcwd())
    
    >>> /Users/daniilshat/PycharmProjects/pythonProject

    С помощью метода listdir() можно получить список с содержимым каталога. В качестве аргумента можно передать путь к директории; если этого не сделать, то система покажет содержимое текущего каталога:

    import os
    
    # содержимое текущего каталога
    print(os.listdir())
    # содержимое директории PycharmProjects
    print(os.listdir('/Users/daniilshat/PycharmProjects'))
    
    >>> ['file.txt', 'main.py', '.idea']
    >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']

    Для создания новых директорий файлов в Python используют метод mkdir(). В качестве аргумента ему надо передать полный путь, включая название новой директории. Для примера создадим директорию Example в PycharmProjects:

    import os
    
    # содержимое директории PycharmProjects до создания
    print(os.listdir('/Users/daniilshat/PycharmProjects'))
    
    os.mkdir('/Users/daniilshat/PycharmProjects/Example')
    
    # содержимое директории PycharmProjects после создания
    print(os.listdir('/Users/daniilshat/PycharmProjects'))
    
    >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']
    >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples']

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

    import os
    
    dir = '/Users/daniilshat/PycharmProjects'
    old_file = os.path.join(dir, 'Example')
    new_file = os.path.join(dir, 'New Example')
    
    # содержимое директории PycharmProjects до переименования
    print(os.listdir(dir))
    os.rename(old_file, new_file)
    # содержимое директории PycharmProjects после переименования создания
    print(os.listdir(dir))
    
    >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples']
    >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples']

    Для удаления пустых директорий файлов в Python можно использовать метод rmdir(), а для удаления директории со всем содержимым — shutil.rmtree(). В качестве аргумента требуется передать путь к директории. Для примера удалим директорию New Example, которую недавно создали:

    import os
    
    # содержимое директории PycharmProjects до удаления
    print(os.listdir('/Users/daniilshat/PycharmProjects'))
    
    os.rmdir('/Users/daniilshat/PycharmProjects/New Example')
    
    # содержимое директории PycharmProjects после удаления
    print(os.listdir('/Users/daniilshat/PycharmProjects'))
    
    >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples']
    >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']

    Коротко о том, как работать с файлами в Python

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

    МетодЧто делает
    os.getcwd()Узнать текущий каталог
    os.listdir(path)Узнать список содержимого каталога
    os.mkdir(path)Создать директорию
    os.rename(old_file, new_file)Переименовать файл или директорию
    os.rmdir(path)Удалить пустую директорию
    shutil.rmtree(path)Удалить директорию со всем содержимым
    file.read(size)Прочитать определенное количество символов из файла
    file.readline()Прочитать строку из файла
    file.readlines()Прочитать все строки из файла
    file.write(string)Записать строку в файл
    file.writelines(list)Записать список строк в файл
    file.seek(int)Переместить указатель
    file.tell()Узнать текущее положение указателя

    Инструкция

    Поделиться

    Скопировано
    0 комментариев
    Комментарии