В качестве сериализованных структур данных программисты на 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('%sn' % 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("%sn" % 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. Это значительно упрощает хранение списка и чтение его обратно в память.