Рубрики
Без рубрики

Чтение и запись списков в файл на Python

Автор оригинала: Frank Hofmann.

В качестве сериализованных структур данных программисты Python интенсивно используют массивы, списки и словари. Для постоянного хранения этих структур данных требуется либо файл, либо база данных. В этой статье описывается, как записать список в файл и как прочитать этот список обратно в память.

Для записи данных в файл и чтения данных из файла язык программирования Python предлагает стандартные методы write() и read() для работы с одной строкой , а также writelines() и readlines() для работы с несколькими строками. Кроме того, как модуль pickle , так и модуль json позволяют также использовать умные способы работы с сериализованными наборами данных.

Использование методов чтения и записи

Для работы с символами (строками) основные методы работают превосходно. Сохранение такого списка строка за строкой в файл listfile.txt можно сделать следующим образом:

# define list of places
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 показывает вам, как он работает:

# define an empty list
places = []

# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
    for line in filehandle:
        # remove linebreak which is the last character of the string
        currentPlace = line[:-1]

        # add item to the list
        places.append(currentPlace)

Имейте в виду, что вам нужно будет удалить разрыв строки из конца строки. В этом случае нам помогает то, что Python также допускает операции со списком строк. В строке 8 приведенного выше кода это удаление просто выполняется как операция списка над самой строкой, которая сохраняет все, кроме последнего элемента. Этот элемент содержит символ “\n”, представляющий разрыв строки в системах UNIX/Linux.

Использование методов writeline и readline

Как уже упоминалось в начале этой статьи, Python также содержит два метода writeline() и readline() для записи и чтения нескольких строк за один шаг соответственно. Чтобы записать весь список в файл на диске, код Python выглядит следующим образом:

# define list of places
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 выглядит следующим образом:

# define empty list
places = []

# open file and read the content in a list
with open('listfile.txt', 'r') as filehandle:
    filecontents = filehandle.readlines()

    for line in filecontents:
        # remove linebreak which is the last character of the string
        current_place = line[:-1]

        # add item to the list
        places.append(current_place)

Приведенный выше список следует более традиционному подходу, заимствованному из других языков программирования. Чтобы написать его более питоническим способом, взгляните на приведенный ниже код:

# define empty list
places = []

# open file and read the content in a list
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 (в приведенном ниже коде) выводится файл list file.data открывается для двоичной записи (“wb”). Во-вторых, в строке 9 список хранится в открытом файле с помощью метода dump () .

# load additional module
import pickle

# define a list of places
placesList = ['Berlin', 'Cape Town', 'Sydney', 'Moscow']

with open('listfile.data', 'wb') as filehandle:
    # store the data as binary data stream
    pickle.dump(placesList, filehandle)

В качестве следующего шага мы читаем список из файла следующим образом. Во-первых, выходной файл list file.data открывается двоичный файл для чтения (“rb”) в строке 4. Во-вторых, список мест загружается из файла с помощью метода load () .

# load additional module
import pickle

with open('listfile.data', 'rb') as filehandle:
    # read the data as binary data stream
    placesList = pickle.load(filehandle)

Два примера здесь демонстрируют использование строк. Хотя pickle работает со всеми видами объектов Python, такими как строки, числа, самодетерминированные структуры и все остальные встроенные структуры данных, предоставляемые Python.

Использование формата JSON

Двоичный формат данных pickle использует специфичный для Python. Для улучшения взаимодействия между различными программами нотация объектов JavaScript ( JSON ) обеспечивает простую в использовании и удобочитаемую схему и, таким образом, стала очень популярной.

В следующем примере показано, как записать список смешанных типов переменных в выходной файл с помощью модуля json . В строке 4 определен базовый список. Открыв выходной файл для записи в строке 7, метод dump() сохраняет базовый список в файле с помощью нотации JSON.

import json

# define list with values
basicList = [1, "Cape Town", 4.6]

# open output file for writing
with open('listfile.txt', 'w') as filehandle:
    json.dump(basicList, filehandle)

Считывание содержимого выходного файла обратно в память так же просто, как и запись данных. Соответствующий метод dump() называется load () и работает следующим образом:

import json

# open output file for reading
with open('listfile.txt', 'r') as filehandle:
    basicList = json.load(filehandle)

Вывод

Различные методы, показанные выше, варьируются от простой записи/чтения данных до сброса/загрузки данных через двоичные потоки с использованием pickle и JSON. Это упрощает постоянное хранение списка и чтение его обратно в память.

Признание

Автор хотел бы поблагодарить Золеку Хатитонгве за ее поддержку при подготовке статьи.