В статье будет описана работа с текстовыми файлами в 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,%sn' % (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, который позволяет помещать объекты в файл не преобразовывая их в строки.
В этой статье я использовал основные типы данных: строки, списки и другие. Сам файл также является основным типом данных. Про некоторые такие типы можете почитать в этой статье.
Дополнительно про файловые объекты можете почитать тут.