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

Что такое файлы в Python

Файлы — это основной тип данных в Python 3, так же как и строки, списки, числа и так далее. Создать объект файл можно с помощью функци open(). Файлы предоставляют методы для решения распределённых задач, в основном это ввод в файл, или вывод из него.

Файл содержит строки. Файлы буферизируются и поддерживают позиционирование. Метод close(), который закрывает файл, часто необязателен, файл автоматически закрывается при сборке мусора.

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

  • r — только чтение;
  • w — только запись, а если файла нет, то создаёт новый файл;
  • r+ — чтение и запись, без создания нового файла;
  • w+ — чтение и запись, если файла нет, то создаёт новый файл.

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

Вот пример работы с файлом:

myfile = open('myfile.txt', 'w') # Открыли файл на запись
myfile.write('Привет Мир!\n')    # Записали первую строку
myfile.write('Всем привет!\n')   # Записали вторую строку
myfile.close()                   # Закрыли файл

myfile = open('myfile.txt', 'r') # Открыли файл на чтение
print(myfile.readline())         ### Привет Мир!
print(myfile.readline())         ### Всем привет!
myfile.seek(0)                   # Вернулись к началу файла
print(myfile.read())             ### Привет Мир!
                                 ### Всем привет!
myfile.seek(0)                   # Вернулись к началу файла
print(myfile.readlines())        ### ['Привет Мир!\n', 'Всем привет!\n']
myfile.close()                   # Закрыли файл

В примере выше используются следующие файловые методы:

  • write(str) — запись строки в файл;
  • readline() — чтение текущей строки;
  • seek(n) — переход на указанную позицию, если указать 0, то перейдёте в начало файла;
  • read(n) — чтение всего файла, при этом можно указать количество символов, которые нужно прочитать;
  • readlines() — чтение всего файла как список строк;
  • close() — закрытие файла.

Файл можно обрабатывать построчно, с помощью цикла for:

### Код
myfile = open('myfile.txt', 'r')
for line in myfile:
   print(line, end='')

### Выполнение
Привет Мир!
Всем привет!

То есть мы, с помощью цикла for пробегаемся по строкам файла и выводим их. Так как все строки в файле оканчиваются на \n (символ перехода на новую строку), то я принудительно указываю сделать конец строки пустым — print(line, end='').

Сохранение объектов в файл

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

a, b, c = 43, 23, 45
mytext = 'Test'
mydict = {'a' : 1, 'b' : 2}
mylist = [1, 2, 3]

# Открываем файл для записи
myfile = open('datafile.txt', 'w')

# Сохраняем в файл первую строку (mytext)
myfile.write(mytext + '\n')

# Преобразуем числа в строку и сохраняем их в файл
myfile.write('%s,%s,%s\n' % (a, b, c))

# Преобразуем список и словарь в строки, разделяем их символом '$' 
# Полученную строку заносим в файл
myfile.write(str(mylist) + '$' + str(mydict))

# Закрываем файл
myfile.close()

# Открываем файл для чтения и сразу его читаем
print(open('datafile.txt', 'r').read()) # Test
                                        # 43,23,45
                                        # [1, 2, 3]${'a': 1, 'b': 2}

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

Считывание объектов из фала

Считать объекты из файла можно следующим образом:

# открываем файл для чтения
myfile = open('datafile.txt', 'r')

# сохраняем первую строку в переменную mytext
mytext = myfile.readline()
# удаление символа конца строки
mytext = mytext.rstrip()
print(mytext)                       ### Test

# сохранение чисел из второй строки в список my_numbers
my_numbers_str = myfile.readline()
# разбиение по запятым
my_numbers_str = my_numbers_str.split(',')
# преобразование всего списка за раз
my_numbers = [int(it) for it in my_numbers_str]  
print(my_numbers)                   ### [43, 23, 45]

# сохранение третьей строки (список и словарь)
# в переменную (mydict_and_list) вставляем третью строку, как список строк (а разделителем у нас будет '$')
mydict_and_list = myfile.readline().split('$')
# сохраняем список
my_list = mydict_and_list[0]
# сохраняем словарь
my_dict = mydict_and_list[1]
print(my_list)                      ### [1, 2, 3]
print(my_dict)                      ### {'a': 1, 'b': 2}

Я постарался в комментариях описать что делает данный код. Если кратко, то при считывании объектов из файла, мы считываем строку, а затем преобразуем эту строку в нужные нам объекты.

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

Существует модуль pickle, который позволяет сохранять объекты в файл не преобразовывая их в строки. Вот как можно работать с этим модулем:

import pickle

# запись в файл
mydict = {'a' : 1, 'b' : 2}
myfile = open('datafile.pkl', 'wb')
pickle.dump(mydict, myfile)
myfile.close()

# считывание из файла
myfile = open("datafile.pkl", 'rb')
mydict = pickle.load(myfile)
print(mydict)     # {'a': 1, 'b': 2}

В примере выше файл отрывался с доступом на запись и на чтение бинарно: ‘wb’ и ‘rb’.

Итог

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

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

Дополнительно про файловые объекты можете почитать тут.

Сводка
Python 3. Работа с файлами
Имя статьи
Python 3. Работа с файлами
Описание
В статье будет описана работа с текстовыми файлами в Python 3. Вы научитесь сохранять строки и другие объекты в файлы а затем считывать их

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *