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