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

Файлы. Работа с файлами в Python

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

my_file = open(имя_файла [, режим_доступа][, буферизация])
При этом:
имя_файла: строка, содержащая имя файла с расширением. Например, «my_file.txt».
режим_доступа: строка, которой мы указываем для чего открывается файл: для чтения, записи, добавления информации, и т.д. Например, «w». По умолчанию файл открывается для чтения — «r».
буферизация: Целое число. Если значение аргумента указано 0 — файл открывается без буферизации, 1 с построчной буферизацией, больше одного процесс буферизации выполняется с указанным размером буфера. Отрицательное число — размер буфера будет равен системному.

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

Чтение файла

Вот открыли мы файл, но а теперь нужно прочитать из него информацию. Для этого есть несколько способов, но большого интереса заслуживают лишь два из них.
Первый — метод read() читает строку из открытого файла.
my_file.read([count])
Необязательный параметр count — это количество байт, которые следует прочитать из открытого файла.

Этот метод читает информацию с начала файла и, если параметр count не указан, до конца файла. Например, прочтем созданный файл text.txt:
my_file = open("text.txt", encoding='utf-8')
my_string = my_file.read()
print("Было прочитано:")
print(my_string)
my_file.close()
  
input("Нажмите Enter для выхода")
Ещё один способ сделать это — прочитать файл построчно, воспользовавшись циклом for:
f = open('text.txt', encoding='utf-8')
for line in f:
  print(line)
  
input("Нажмите Enter для выхода")
Разные способы чтения из текстового файла:
print("** Открытие и закрытие файла **")
txt = open("text.txt", "r", encoding='utf-8')
txt.close()

print("** Посимвольное чтение файла **")
txt = open("text.txt", "r")
print(txt.read(1))
print(txt.read(2))
print(txt.read(6))
txt.close()

print("** Посимвольное чтение с указанием кодировки **")
txt = open("text.txt", "r", encoding='utf-8')
print(txt.read(1))
print(txt.read(2))
print(txt.read(6))
txt.close()

print("** Чтение всего файла **")
txt = open("text.txt", "r", encoding='utf-8')
content = txt.read()
print(content)
txt.close()

print("** Читаем строку из файла посимвольно **")
txt = open("text.txt", "r", encoding='utf-8')
print(txt.readline(1))
print(txt.readline(5))
txt.close()

print("** Читаем строку из файла полностью **")
txt = open("text.txt", "r", encoding='utf-8')
print(txt.readline())
print(txt.readline())
txt.close()

print("** Чтение всего файла в список **")
txt = open("text.txt", "r", encoding='utf-8')
lines = txt.readlines()

print(lines)
print(len(lines))
for line in lines:
   print(line)
   
txt.close()

print("** Построчное чтение файла **")
txt = open("text.txt", "r", encoding='utf-8')
for line in txt:
  print(line)
txt.close()

input("Нажмите Enter для выхода")
Результат выполнения программы:

Запись файла

Метод write() записывает любую строку в открытый файл. Важно помнить, что строки в Python могут содержать двоичные данные, а не только текст. Метод write() не добавляет символ переноса строки (‘\n’) в конец файла.
Синтаксис метода write():
my_file.write(string);
my_file = open("primer.txt", "w")
my_file.write("Мне нравится Python!\nЭто классный язык!")
my_file.close()
input("Создание файла и запись завершена!")
Вышеприведенный код создаст файл primer.txt и запишет в него указанную строку.

Закрытие файла

Python автоматически закрывает файл если файловый объект к которому он привязан присваивается другому файлу. Однако, хорошей практикой будет вручную закрывать файл командой close(). Например:
my_file = open("primer.txt")
print("Имя файла: ", my_file.name)
print("Файл закрыт: ", my_file.closed)
my_file.close()
print("А теперь закрыт: ", my_file.closed)
input("Нажмите Enter для выхода")

Консервация

Консервация — это долговременное хранение структурированных данных. Программист может «законсервировать» в файл, то есть сохранить в неизменном виде структуру, такую как список или словарь.
Для поддержки консервации нужно импортировать в программу два модуля:
import pickle
import shelve
Первый модуль позволяет консервировать структуры данных и сохранять их в файлах, а второй модуль обеспечивает произвольный доступ к законсервированным объектам.

Пример консервации:
import pickle
import shelve

first_name = ["Витя", "Максим", "Коля"]
last_name = ["Сидоров", "Петров", "Иванов"]

datafile = open("names.dat", "wb")

pickle.dump(first_name, datafile)
pickle.dump(last_name, datafile)
datafile.close()

input("Файл создан")
Данный пример создает и записывает данные в файл «names.dat». Данные будут записаны в двоичном виде.

Пример чтения файлов из бинарного файла (законсервированного). Листинг:
import pickle
import shelve

datafile = open("names.dat", "rb")
fnames = pickle.load(datafile)
lnames = pickle.load(datafile)
datafile.close()

print(fnames)
print(lnames)

input()

# Будет выведено:
['Витя', 'Максим', 'Коля']
['Сидоров', 'Петров', 'Иванов']

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

После консервации нескольких списков можно получить доступ к одному произвольному списку. В этом может помочь модуль shelve. Первым делом необходимо создать полку:
s = shelve.open("text.dat")
Данная функция работает подобно файловой функции open(), но открывает не текстовый файл, а файл с консервированными объектами.

Функции shelve.open() нужно передать только имя файла. Второй необязательный параметр — это режим доступа, который может быть:

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

n — создание нового файла для чтения и записи, если файл существует, он будет перезаписан.

r — доступ только чтение, если файл не существует, вы получите сообщение об ошибке.

w — доступ только запись, если файл не существует, вы получите сообщение об ошибке.

Рассмотрим пример:
import pickle
import shelve

s = shelve.open("text.dat")

s["first_name"] = ["Витя", "Максим", "Коля"]
s["last_name"] = ["Сидоров", "Петров", "Иванов"]

s.sync()
s.close()

s = shelve.open("text.dat")
print(s["last_name"])
input()
В данном примере мы создаем функцию создания полки, а затем помещаем данные «на полку». Далее проверяем запись и открываем файл и прочитаем список фамилий с полки. Вывод программы:
Видео по уроку:
Самоучитель по Python