В качестве сериализованных структур данных программисты 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.
Использование методов Writelines и Readlines
Как упоминалось в начале этой статьи, Python также содержит два метода
writelines()
и readlines()
для записи и чтения нескольких строк за
один шаг соответственно. Чтобы записать весь список в файл на диске, код
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 (в приведенном ниже коде) выходной файл
listfile.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)
Следующим шагом мы читаем список из файла следующим образом. Во-первых,
выходной файл listfile.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. Это упрощает постоянное хранение списка и чтение его обратно в память.
Благодарности
Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.