В качестве сериализованных структур данных программисты на Python активно используют массивы, списки и словари. Хранение этих структур данных постоянно требует файл или базу данных для работы с ними. Эта статья рассказывает, как печатать список в файл и как считать его обратно в память.
Чтобы записать данные в файл и считать их из файла, язык программирования Python предлагает стандартные методы write() and read() для работы с одиночными строками, а также writelines() и readlines() для работы с множеством строк. Более того, модули pickle и json module предоставляют разумные способы работы с сериализованными наборами данных.
Оглавление
Использование методов read и write
Основные методы отлично работают с символами (строками). Построчное сохранение списка в файл listfile.txt
работает следующим образом:
# определим список мест places = ['Berlin', 'Cape Town', 'Sydney', 'Moscow'] with open('listfile.txt', 'w') as filehandle: for listitem in places: filehandle.write('%s\n' % listitem)
В строке 6 listitem
дополнен символом разрыва строки “\n”, во-первых, и сохранён в выходном файле, во-вторых. Как прочесть список полностью из файла listfile.txt обратно в память, покажет следующий код на Python:
# определим пустой список places = [] # откроем файл и считаем его содержимое в список with open('listfile.txt', 'r') as filehandle: for line in filehandle: # удалим заключительный символ перехода строки currentPlace = line[:-1] # добавим элемент в конец списка places.append(currentPlace)
Имейте в виду, что вам понадобится удалить перенос строки в самом её конце. Здесь нам помогает то, что Python позволяет применять списочные операции к строкам. В строке 8 кода выше удаление сделано просто как операция над самой строкой, что сохраняет всё, кроме последнего элемента. Он содержит символ “\n”, обозначающий перенос строки в системах UNIX/Linux.
Использование методов writelines и readlines
Как упомянуто в начале этой статьи, Python также содержит два метода writelines()
и readlines()
, чтобы писать и читать множество строк за один шаг соответственно. Напечатать весь список в файл или на диск поможет следующий код на Python:
# определим список мест places_list = ['Berlin', 'Cape Town', 'Sydney', 'Moscow'] with open('listfile.txt', 'w') as filehandle: filehandle.writelines("%s\n" % place for place in places_list)
Прочитать весь список из файла на диске поможет следующий код на Python:
# определим пустой список places = [] # откроем файл и считаем его содержимое в список with open('listfile.txt', 'r') as filehandle: filecontents = filehandle.readlines() for line in filecontents: # удалим заключительный символ перехода строки current_place = line[:-1] # добавим элемент в конец списка places.append(current_place)
Код выше показывает более традиционный подход, взятый из других языков программирования. Чтобы написать его в более “питоньем” стиле, посмотрим на код ниже:
# определим пустой список places = [] # откроем файл и считаем его содержимое в список with open('listfile.txt', 'r') as filehandle: places = [current_place.rstrip() for current_place in filehandle.readlines()]
Открыв файл listfile.txt
в строке 5, полностью переделываем список в строке 6. Сначала читаем содержимое файла через readlines()
. Затем в цикле for
удаляем окончание из каждой строки с помощью метода rstrip()
. В конце добавляем строку к списку мест как новый элемент. По сравнению с прошлым листингом код получился более компактным, но его может быть сложнее прочесть начинающим программистам на Python.
Использование модуля pickle
Другие методы, объяснённые до сих пор, хранят список в читаемом для человека формате. В случае, когда это не нужно, вам может пригодиться модуль pickle. Его метод dump()
эффективно хранит список в виде двоичного потока данных. В строке 7 (в коде ниже) выходной файл listfile.data
открыт для записи в двоичном режиме (“wb”). В строке 9 список хранится в открытом файле с использованием метода dump()
.
# загружаем дополнительный модуль import pickle # определим список мест placesList = ['Berlin', 'Cape Town', 'Sydney', 'Moscow'] with open('listfile.data', 'wb') as filehandle: # сохраняем данные как двоичный поток pickle.dump(placesList, filehandle)
На следующем шаге мы читаем список из файла. Сначала открываем выходной файл listfile.data
для чтения в двоичном режиме (“rb”) в строке 4. Потом загружаем список мест из файла, применяя метод load()
.
# загружаем дополнительный модуль import pickle with open('listfile.data', 'rb') as filehandle: # сохраняем данные как двоичный поток placesList = pickle.load(filehandle)
Эти два примера показывают использование строк. Кстати, pickle
работает со всеми видами объектов языка Python, такими как строки, числа, определённые в самом коде структуры, а также любые другие встроенные структуры данных Python.
Использование формата JSON
Используемый pickle
формат двоичных данных специфичен для Python. Чтобы улучшить взаимодействие между различными программами, JavaScript Object Notation (JSON) предлагает лёгкую в использовании и читаемую для человека схему, и поэтому стал очень популярным.
Следующий пример показывает, как печатать список из элементов различных типов в выходной файл с помощью модуля json. В строке 4 определён основной список. Имея открытым файлом для записи в строке 7, метод dump()
хранит основной список в файле, используя JSON.
import json # определим список со значениями basicList = [1, "Cape Town", 4.6] # открываем выходной файл для записи with open('listfile.txt', 'w') as filehandle: json.dump(basicList, filehandle)
Читать содержимое выходноо файла обратно в память так же просто, как записывать данные. Соответствующий dump()
метод называется load()
и работает следующим образом:
import json # открываем выходной файл для чтения with open('listfile.txt', 'r') as filehandle: basicList = json.load(filehandle)
Вывод
Методы, показаные выше, разнятся от простой записи/чтенияя данных до сброса/загрузки через двоичные потоки с помощью pickle и JSON. Это значительно упрощает хранение списка и чтение его обратно в память.