Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Python. Методы сохранения данных.

Запись от Фаер размещена 12.09.2012 в 20:54
Показов 19365 Комментарии 0
Метки python

На самом деле Python очень искусен в сохранении различных данных. Конечно, самый простой способ "запоминания" это запись в текстовый файл. Однако данный метод довольно неудобен, поэтому Мы рассмотрим более продуктивные способы.

Модуль struct:
Вообще-то, этот модуль имеет несколько другую цель, нежели сохранение: он упаковывает данные в строки байтов. Но после упаковки можно уверенно записать результат в файл. Например:

Python
1
2
3
4
5
6
7
import struct,os
f=open('C:/Out','wb')    #создаём файл байтов
pipe=os.popen('C:/In.py')#создаём "трубу", через которую читаем данные из скрипта In.py
data=int(pipe.read())
bdata=struct.pack('>i',data)#запаковываем data в строку байтов
f.write(bdata)
f.close()
Скрипт In.py:

Python
1
2
3
import random
s=random.randint(1,100)
print(s)
В принципе, догадаться что тут происходит совсем не трудно:

Мы открываем(создаём) файл в режиме записи байтов('wb').
Соединяем основной скрипт со вспомогательным In.py(в котором генерируется и выводится какое-то число) посредством "трубы". Читаем это самое число в переменную data. Переводим полученное число в строку байтов и сохраняем.
Обратите внимание: скрипт In.py запустится как дочерний процесс, Ваше участие при этом не требуется(за исключением непосредственно его написания).

Подробнее о команде struct.pack('>i',data):
'>i' - означает, что Мы запаковываем число int слева направо в байткод.('<...' - запаковка в обратном порядке байтов). Кроме int можно паковать: short(h), string(s), double(d), long(l), char(c), float(f) и некоторые другие типы).
В результате Мы получаем строку байтов bdata, которую благополучно записываем в файл.

Для того, чтобы эту строку после чтения привести в человеческий вид используем команду unpack():

Python
1
2
3
4
5
6
import struct
f=open('C:/Out','rb')
bdata=f.read()
data=struct.unpack('>i',bdata)
print(data)
f.close()
Если в строке bdata будет несколько значений(которые Вы должны перечислить после знака '>', например, ('>ifi', 3, 2.421, 8) - три числа соответствующих типов), то после вызова unpack() Вы получите список(list).

В общем-то и всё. Однако данный метод не самый эффективный и не самый приятный, особенно если учесть '>...'. Поэтому давайте разберём другое заклинание, основанное на модуле pickle:

Python
1
2
3
4
5
import pickle
f=open('C:/out','wb')
s=['python',2,45.31]
pickle.dump(s,f)
f.close()
В результате выполнения данного скрипта Мы получаем файл байтов.
Выглядит гораздо проще, чем struct. Чтение записанных данных также дело не мудрёное:

Python
1
2
3
4
5
import pickle
f=open('C:/out','rb')
s=pickle.load(f)
print(s)
f.close()
Главное не забывайте, что файлы открываются для чтения в режиме 'rb'(read bytes), для записи: 'wb'(write bytes), и что в инструкции dump() пишем сначала объект, который хотим сохранить, а уже потом файл.

Казалось бы, что ещё нужно? Просто, кратко, понятно, да и структура данных сохраняется. Но проблемы могут возникнуть во время работы с большими базами данных. Модуль pickle сохраняет объекты последовательно.
Следовательно, для того чтобы добраться до 10-го объекта, например, нужно будет прочитать предыдущие девять, а это может занять много времени. Поэтому давайте рассмотрим ещё более высокоуровневый модуль shelve.

Этот самый модуль позволяет структурировать данные, записываемые в файл, с помощью ключей. Как словарь.

Python
1
2
3
4
5
6
7
import shelve
f=shelve.open('C:/Out','n')# 'n' - new 
s=['hack','crack']
t=['prog',32]
f['negative']=s
f['positive']=t
f.close()
Таким образом, Вам не нужно выгружать всю базу данных, Вы просто читаете нужный Вам фрагмент по ключу:

Python
1
2
3
4
5
import shelve
f=shelve.open('C:/Out','rb')
print(f['negative'])
print(f['positive'])
f.close()
Заметьте, что модуль shelve создаёт не один файл, а целых три. Но что куда важнее, нет нужды колдовать, достаточно открыть файл через shelve.open(), ну а потом уже просто закрыть его - вся база данных сохранится автоматически.

Модуль dbm
В Python API имеется модуль, схожий с shelve, но всё же менее мощный. Он позволяет создавать базы данных, по своему устройству похожие на словари. Слабость этого модуля заключается в том, что в создаваемых им файлах можно сохранять только строки текста и строки байтов. В принципе, модуль pickle может перевести в строку байтов практически любой объект, однако после сохранения и обратной загрузки Вы можете получить совсем не то, что сохраняли(так, по крайней мере, утверждают разработчики). Поэтому не стоит злоупотреблять способностями pickle. Вот как модуль dbm выглядит в деле:
Python
1
2
3
4
5
6
7
import dbm
f=dbm.open('C:\\file','n')        #обратите внимание на ключ 'n'
f['string1']='Hello, world!'
f.close()
 
f=dbm.open('C:\\file')
print(f['string'].decode())
Сходство с shelve налицо. Такая же структура, так же просто сохранять/загружать данные. Единственное, не забывайте переводить сохраняемые объекты в строки байтов.
Метки python
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru