5/5 - (4 голоса)

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here