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

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

Запись от Фаер размещена 12.09.2012 в 20:54
Показов 19251 Комментарии 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
Комментарии
 
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru