Обновлення файлу типу SHELVE.

Ще завдання

Поміняти ключі і значення ключів місцями ( із українсько-російського словника зробити російсько-український)

def invert_dict(d): inv = dict() for key in d: val = d[key] if val not in inv: inv[val] = [key] else: inv[val].append(key) return inv

Ми створили новий словник на базі старого.

 

Приклади:

Словник як телефонний довідник:

>>> dic = {'vanya' : 23323223, 'smith' : 32232332} >>> dic['fedya'] = 33332222 >>> dic {'vanya': 23323223, 'fedya': 33332222, 'smith': 32232332} >>> dic['smith'] >>> del dic['vanya'] >>> dic {'fedya': 33332222, 'smith': 32232332} >>> dic.keys() ['fedya', 'smith'] >>> dic.has_key('fedya') True Створити словник за допомогою спписка кортежів:
>>> items = [('name','sveta'),('age',20)] >>> d = dict(items) >>> d {'age': 20, 'name': 'sveta'}   >>> len(d)

 

Для сканування словника по ключам скористаємось for:

>>> table = {'Python': 'Guido van Rossum', ... 'Perl': 'Larry Wall', ... 'Tcl': 'John Ousterhout' } >>> for lang in table: ... print(lang, table[lang]) .. >>> Tcl John Ousterhout >>> Python Guido van Rossum >>> Perl Larry Wall

 

Словники добре підходять для організації зберігання багатовимірних масивів і матриць з елементами, що повторюються:

>>> Matrix = {} >>> Matrix[(2, 3, 4)] = 88 >>> Matrix[(7, 8, 9)] = 99 >>> >>> X = 2; Y = 3; Z = 4 >>> Matrix[(X, Y, Z)] >>> Matrix {(2, 3, 4): 88, (7, 8, 9): 99}

 

За допомогою словників можна зберігати структуровану інформацію у вигляді записів:

>>> man = {'name': 'Serg', ... 'jobs': ['programmer', 'writer'], ... 'web': 'www.iakovlev.org', ... 'home': {'city': 'Moscow', 'zip':129000}} >>> man['name'] Serg >>> man['jobs'][1] 'writer'

 

Методи словника

   
cmp(dict1, dict2) Порівнює елементи двох словників.
len(dict) Повертає число елементів словника..
str(dict) Повертає рядок, який представляє словник.
type(variable) Повертає тип елемента
   
dict.clear() опорожняє dict
dict.copy() повертає копію словника
dict.fromkeys(seq, val) створює новий словник із послідовностей seq, val .
dict.get(key, default=None) При наявності ключа key повертає його значення інакше - значення default (тут None)
dict.has_key(key) Повертає true при наявності значення key, інакше - false
dict.items() Повертає список пар (key, value)
dict.keys() повертає список ключових слів
dict.setdefault(key, default=None) Подібний до get(), але якщо елемент відсутній, то повертає значення із default
dict.update(dict2) Доповнює словник dict елементами із dict2
dict.values() повертає список значень словника

 

Структура СЛОВНИК розрахована на використання в оперативній памяті. Якщо ви маєте намір використати зовнішню пам'ять із збереженням логіки роботи з dict – скористайтесь модулем пайтону SHELVES

Shelve

Для отримання доступу до shelve імпортуйте модуль і відкрийте в ньому файл під будь ч\яким іменем (нижче вибрано імя shelf):

import shelveshelf = shelve.open('filename')

Якщо такого файлу не існує – він буде створений автоматично. Тепр ви можете отримати доступ до обєктів shelve так, як це зроблено в словнику:

shelf['key'] = object # create or change the entry for 'key' object = shelf['key'] # load the entry for 'key' count = len(shelf) # return the number of entries list = shelf.keys() # get the list of stored keys found = shelf.has_key('key') # check if there's an entry for 'key' del shelf['key'] # remove the entry for 'key'

Exercise 1: Створіть клас student з атрибутами name, address і vuz студента. Потім створіть базу даних типу shelve, яка використовує в ролі ключа порядковий номер запису студента і занесіть до неї об’єкти класу student, що відповідають студентам вашої групи.

Exercise 2: Створіть програму, яка читає файл попереднього прикладу та роздруковує імена всіх студентів, занесених до файлу.

Обновлення файлу типу SHELVE.

Оскільки всяка зміна об’єкту, прочитаного із зовнішнього файлу відбувається в оперативній памяті, для збереження відредагованого обєкту в зовнішній памяті слід скористатись операцією обновлення даних:

>>> import shelve>>> shelf = shelve.open('shelve_test')>>> >>> shelf['key'] = [1,2,3]>>> print shelf['key'][1, 2, 3]>>> >>> shelf['key'].append(4) # зміна відбулася в буфері ОП, але не в ЗП>>> print shelf['key'] # роздруковується старе значення[1, 2, 3]

Є два способи поновлення інформації в базі даних :

>>> import shelve>>> shelf = shelve.open('shelve_test')>>> >>> shelf['key'] = [1,2,3]>>> print shelf['key'][1, 2, 3]>>> >>> list = shelf['key'] # запамятовуємо значення, яке слід відредагувати>>> list.append(4) # тепер модифікуємо його>>> shelf['key'] = list # запам’ятовуємо нове значення в ЗП>>> print shelf['key'] # роздруковуємо із ЗП[1, 2, 3, 4]

Другий спосіб обновлення даних – це використання опції writeback при відкритті файлу. Встановлення цього значення в True,дозволяє кешування змін. Проте кеш буде скинутий у файл при використанні методу sync або close.

>>> import shelve>>> >>> shelf = shelve.open('shelve_test', writeback=True)>>> >>> shelf['key'] = [1,2,3]>>> print shelf['key'][1, 2, 3]>>> >>> shelf['key'].append(4) # цей запис буде кешований>>> shelf.sync() # скидаємо кеш у файл>>> print shelf['key'] # перевіряємо вміст запису файлу[1, 2, 3, 4]

Exercise 3: Складіть програму, яка додає до списку атрибутів зареєстрованих обєктів з непарними номерами реєстраційний номер.