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

В статье будет описана работа с текстовыми файлами в 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, который позволяет помещать объекты в файл не преобразовывая их в строки.




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




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



2023-03-17T14:04:12
Python