Знания по работе с файлами при написании программ, особенно связанных с обработкой и анализом данных – 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 файлами отличаются от методов работы с обычными текстовыми файлами. И мы их рассмотрим в следующем материале.