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

Знания по работе с файлами при написании программ, особенно связанных с обработкой и анализом данных – 100% необходимость. Python имеет простые и элегантные инструменты для этого. И начнем мы с обычных текстовых файлов, тем более, что основные методы работы будут подходить и для других типов файлов. Сразу отмечу, что работу с файлами JSON и CSV файлами мы рассмотрим чуть позже в отдельном конспекте.

Все примеры в файле Jupyter Notebook

 

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

open(): открывает файл и возвращает объект файла, который можно использовать для чтения или записи данных.
close(): закрывает файл после работы с ним.
read(): читает данные из файла. Если указан аргумент, то читает указанное количество символов, иначе читает весь файл.
write(): записывает данные в файл.
seek(): устанавливает позицию чтения/записи в файле.
tell(): возвращает текущую позицию чтения/записи в файле.
readline(): читает одну строку из файла.
writelines(): записывает список строк в файл.
flush(): принудительно записывает буферизованные данные в файл.

Для открытия файла используется метод open(). Остановимся на его параметрах:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file: Это обязательный параметр, который указывает путь к файлу, который вы хотите открыть.
mode: Это опциональный параметр, который указывает режим открытия файла. Указывайте его явно всегда. По умолчанию равен ‘r’.

Возможные значения режима mode:
‘r’: read – чтение (по умолчанию)
‘w’: write – запись (если файл уже существует, содержимое будет удалено)
‘x’: exclusive – исключительный доступ
‘a’: append – добавление (данные будут добавлены в конец файла)
‘b’: binary – двоичный режим
‘t’: text – текстовый режим (по умолчанию)
‘+’: позволяет работать с файлом одновременно в режиме чтения и записи

buffering: Это опциональный параметр, который указывает размер буфера для чтения/записи данных. По умолчанию значение -1 означает, что буферизация будет использоваться в соответствии с системными настройками.
encoding: задает кодировку в файле и он очень важен. Желательно использовать этот параметр всегда и со значение encoding=”utf-8″.
errors: Это опциональный параметр, который указывает, как обрабатывать ошибки кодировки. По умолчанию значение None означает, что ошибки будут вызывать исключение.
newline: Это опциональный параметр, который определяет символ новой строки. По умолчанию значение None означает, что будет использоваться символ новой строки, определенный системой.

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

Метод close() используется для закрытия открытого файла. Когда файл закрывается с помощью метода close(), все ресурсы, связанные с файлом, освобождаются. Вот пример:

infa = 'Привет, файл!'
file = open("myfail.txt", "w", encoding="UTF-8")
file.write(infa)
file.close()

Однако, более удобным и наглядным будет вместо вызова метода close() использовать оператор with, который автоматически закрывает файл после выполнения блока кода, наглядно смещенным табуляцией вправо. Вот  аналогичный пример:

infa = "Привет, файл!"
with open("myfail.txt", "w", encoding="UTF-8") as file:
    file.write(infa)

При открытии файла в режиме “w” (запись) мы используем один метод write().

Метод write() используется для записи данных в файл. Он принимает один аргумент – строку, которую нужно записать в файл. Если файл уже существует, то метод write() перезаписывает его содержимое. Если файл не существует, то он будет создан. В примере ниже мы записываем в файл текстовое приветствие, число, текущую дату и значения элементов списка. Текст и дату предварительно приводим к строке, а список объединяем в одну строку функцией str.join()

import datetime

infa1 = "Привет, файл!"
infa2 = 777
infa3 = datetime.date.today()
infa4 = ["Привет, текст!", "Привет, число!", "Привет, дата!"]

with open("myfail.txt", "w", encoding="UTF-8") as file:
    file.write(infa1 + "\n")
    file.write(str(infa2) + "\n")
    file.write("\n" + infa3.strftime("%A, %d %B %Y") + "\n" + "\n" + "\n" + "\n" + "\n")
    file.write("*******".join(infa4))
    file.write("\n".join(infa4))

При записи данных очень часто используется символ ‘\n’, который указывает интерпретатору Python начать новую строку“\n” – символ новой строки. Например в коде print(“Привет,\n файл!”) одна строка разделяется символом ‘\n’ на две строки.

Использование режима mode = ‘a’. В этом случае при открытии файла в Python и записи данных, они будут добавляться в конец файла, а не перезаписываться. Если файл не существует, он будет создан. Вот пример, в котором последовательно записываем 10 строк с случайными числами и если программу запустим второй раз, то в текстовом файле станет уже 20 строк и т.д.

import random

infa = "Случайное число:"
with open("myfail.txt", "a", encoding="UTF-8") as file:
    for i in range(10):
        file.write(infa + " " + str(random.randint(1, 10000)) + "\n")

При открытии файла в режиме “r” (чтение) мы используем несколько методов.

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

with open("myfail.txt", "r", encoding="UTF-8") as file:
    inform = file.read()
    print(inform)

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

with open("myfail.txt", "r", encoding="UTF-8") as file:
    for i in range(30):
        infa = file.readline()
        print(infa)

полезный вариант: последовательное построчное чтения файла можно выполнить с помощью for.

with open("myfail.txt", "r", encoding="UTF-8") as file:
    for stroka_faila in file:
        print(stroka_faila)

Метод readlines() является встроенной функцией в Python, которая позволяет прочитать все строки из файла и вернуть список строк.
В примере ниже мы открываем файл и используем функцию readlines() для чтения всех строк из файла и сохранения их в переменной lines. Затем мы проходимся по каждой строке в списке lines и выводим их на экран.

with open("myfail.txt", "r", encoding="UTF-8") as file:
    lines = file.readlines()
    for line in lines:
        print(line)

Так как readlines() возвращает список строк, то мы также можем обращаться к любой строке по ее индексу, например, lines[0] для первой строки, lines[1] для второй строки, и т.д.

Метод writelines() записывает список строк в файл. В примере у нас есть список строк lines, который мы хотим записать в файл. Мы открываем файл, вызываем метод writelines() на объекте файла и передаем ему список строк для записи.

lines = ["Это первая строка.", "Это вторая строка.", "Это третья строка."]


with open("myfail.txt", "w", encoding="UTF-8") as file:
    file.writelines(lines)

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

lines = ["Это первая строка.", "Это вторая строка.", "Это третья строка."]
lines_with_newline = [line + "\n" for line in lines]


with open("myfail.txt", "w", encoding="UTF-8") as file:
    file.writelines(lines_with_newline)

 

Режим “+” при работе с файлами в Python используется для открытия файла в режиме чтения и записи. 

Режим “a+” открывает файл для чтения и записи, при этом указатель файла устанавливается в конец файла. Если файл не существует, он будет создан. Затем, при записи данных в файл, они будут добавлены в конец файла.

Режим “+” (open(“file.txt”, “+”)) также открывает файл для чтения и записи, но указатель файла устанавливается в начало файла. Если файл не существует, он будет создан. При записи данных в файл, они заменяют существующие данные в файле, а не добавляются в конец.

Таким образом, выбор между режимами “a+” и “+” зависит от того, как вы хотите работать с файлом. Если вам нужно добавить данные в конец файла, используйте режим “a+”. Если вам нужно заменить существующие данные в файле, используйте режим “+”.

 

Режим ‘x’ в функции open() в языке Python обозначает “исключительный доступ” к файлу. Когда файл открывается в этом режиме, он должен быть новым файлом, то есть не существовать на диске. Если файл уже существует, то при попытке открытия файла в режиме ‘x’ будет вызвано исключение FileExistsError. Такой режим может быть полезен, когда вам нужно создать новый файл и гарантировать, что он не существует. Если файл уже существует и вы не хотите его перезаписывать, то вместо режима ‘x’ вы можете использовать режим ‘w’ (запись), который удалит содержимое файла, но не вызовет исключение при существующем файле.


Мы с Вами рассмотрели наиболее распространенные методы работы с файлами.

Вот методы, которые могут использоваться как для работы с txt файлами, так и для работы с JSON и CSV файлами:

open() – для открытия файла любого типа.
read() – для чтения содержимого файла.
write() – для записи данных в файл.
close() – для закрытия файла.

Однако, специфические методы для работы с JSON и CSV файлами отличаются от методов работы с обычными текстовыми файлами. И мы их рассмотрим в следующем материале.

Оцените статью
Репост в TG и VK
Алготрейдинг шаг за шагом. Создай торгового робота на Python с нуля по нашим урокам. Автоматизируй торговлю на бирже по собственной стратегии.