Саммерфилд - Программирование на Python 3 (1077331), страница 86
Текст из файла (страница 86)
После этого, если аргумент Кеер ЬасКор имеет значение Еа1эе (по умолчанию), файл резервной копии удаляется. В заключение, чтобы подготовиться к последующим операциям чтения и записи, уплотненный файл (который теперь имеет имя оригинального файла) открывается. Класс 81пагуйесогбЕт1е. ВтпагуйесогбЕт1е содержит весьма низкоуровневую реализацию, но он может служить основой для классов более высокого уровня, где необходима возможность произвольного доступа к данным в файлах, хранящих записи фиксированного размера; это будет показано в следующем подразделе.
Пример: классы в модуле Вйе51ос1( Модуль 81Ке81осК использует класс 81па гуйесо гбЕ11е. Втпа гуйесогбЕт1е для управления простым хранилищем информации. Элементами хранения является информация о велосипедах, каждый из которых представляет собой экземпляр класса 81Ке8!ЬЬК.В!Ке8!ЬЬК. Класс В!Кей!осК.В1Ке- 8!осК содержит в себе словарь, ключами которого являются идентификаторы велосипедов, а значениями — индексы соответствующих записей в ВтпагуйесогбЕ11е. 81пагуйесогбЕ!1е. Ниже приводится короткий пример, дающий некоторое представление о том, как работают эти классы: Ьтсус!еа = ВтхезтосК.В!Ке8тосК(втКе Г11е) ча1ое = 0.0 Гог ЫКЕ тл Ь!сус1ев: ча1ие»= ЫКе.ча1че Ьтсус1еа.тпсгеаае атосК("6ЕККО", 2) Гог ЫКе тп Ысус1еа: !Г ЫКе.!беп!тту.втаг!ачг11Ь("840").' 1Г по! Ьтсус1ев.!псгеаве атосК(ЫКе, !сепг!!у, 1); рг1пт("вгоск аачеаепт га11еб гог", ыке.!беп!1гу) Этот фрагмент программного кода открывает файл хранилища информации о велосипедах, выполняет итерации по всем содержащимся в нем записям и определяет общую стоимость (сумма произведений ценах количество) велосипедов на складе.
Затем он увеличивает на два количество велосипедов «СЕККО», хранящихся на складе, и на один — количество велосипедов, названия которых начинаются с «В4()». Все эти действия выполняются непосредственно с информацией на диске, поэтому любые другие процессы, обращающиеся к файлу хранилища, имеют доступ к самой свежей информации. Класс 81пагуйесогбЕ11е.
81пагуйесогбЕ!1е работает с файлом в терминах индексов, тогда как класс 81Ке8!осК.ВтКе8!ЬсК работает в терминах идентификаторов велосипедов. Это возможно благодаря тому, что экземпляр класса В!Кей!осК,В!Кей!ЬЬК хранит словарь, устанавливаю- Произвольный доступ к двоичным данным в файлах ЗВУ щий отношения между идентификаторами велосипедов и индексами записей.
Сначала рассмотрим инструкцию с1ава и метод инициализации класса В1КеЗтосК. В! Ке, затем обсудим некоторые методы класса В1КеЗ(ссК. В1КеЗтосК и в заключение посмотрим на программный код, играющий роль связутощего звена между объектами В1КеЗтосК, В1Ке и двоичными записями, представляющими их в В1пагуйесогбЕ11е. ВтпагулесогбЕ11е (весь программный код находится в файле ВИеЯ!ос)г.ру). с1аьа В1хе: бег 1пзт (ае1(, заест!ту, паае, снап(1ту, рг[се); аавегт 1еп(абел!!ту) > 3, ("1пча1!б ыке !беп(1(у '(О)'" . Гсгаат(!сепг!ту) ) ае1г, шепт(ту = шепт(ту ае1(, паве = паве ае1(.сиапт1ту = пчапт!ту ае1(.рг!се = рг1се Все атрибуты класса ВТКе доступны внешнему программному коду как свойства — идентификатор велосипеда (ве1(.
!бел!1!у) представляет свойство Взке. !беп!1ту, доступное только для чтения, остальные свойства доступны как для чтения, так и для записи и обеспечивают дополнительную проверку корректности записываемых данных с помощью инструкции аааег1. Дополнительно имеется свойство В!Ке.ча1се, доступное только для чтения, возвращающее произведение цены на количество. (Здесь не приводится программный код реализации свойств, так как он похож на программный код, который приводился ранее,) Класс ВТКеЗтосК.
В1КеЗтосК реализует собственные методы манипулирования объектами типа В!КеЗтрсК.В)Ке, которые используют свойства объектов класса В!КеЗтосК. В1Ке, доступные для записи. с1ава ВТКезтсск: бет !п11 (ве1(, Г!1епаае): ве1Г. (11е = В!пагуаессгбЕ11е.з1пагуаесргбЕ11е(тт1епаае, В!КЕ ЗТНОСТ.а)зе) ве1(. !пбех ггса !беж!ту = () Грг 1пбех 1п галсе(1еп(ае1(. Гз1е)): гессгб = ае1(. Гт1е[[пбех] 1( гессгб !а пст Нспе. Ьтхе = Ьихе Ггса гессгб(гессгб) ае1(. тпбех Ггра !бепт1ту[Ь[Ке. 1бепт!ту] = 1пбех Класс В1КеЗ!ЬЬК.
ВзхеЗтосК вЂ” это наш собственный класс коллекций, агрегирующий экземпляр класса В1пагуйесогбЕ!1е. В[па гуйесогбрз1е (зе1г. (11е) и словарь (ве1(, зпбех Ггоа !бел!!ту), ключами которого являются идентификаторы велосипедов, а значениями — индексы записей с информацией о них.
звв Глава 7. Работа с файлами После открытия файла (или создания, если перед этим файл не существовал) выполняются итерации по записям, содержащимся в нем (если таковые имеются). Каждая извлеченная запись преобразуется из объекта типа Ьу!ев в объект В!Кей!осК. В!Ке с помощью частной функции ЬГКе Ггоа гесогб(), после чего идентификатор велосипеда и индекс записи добавляются в словарь ве1[. тпбех Ггоа !беп!!!у.
бег вррепб(вв11, ЬГКе): !пбех = 1еп(ве11. ГГ1е) ве!Г Гт1е[!пбех] = гвсогб Ггоа Ь!Ке(Ь!Ке) вв1Г, !пбвх ггоа тбепттту[ыке.!бел!!Гу] = тпбех Чтобы добавить новый велосипед, необходимо определить подходящий номер позиции и поместить в эту позицию запись с двоичным представлением информации о велосипеде. При этом мы не забываем дополнитьсловарьве1[. тпбех Ггоа !берт!!у. беГ бе11теа (ве)Г, !бепт1ту): бе1 ве1Г Г!1е[ве1Г. !пбех Ггоа !бепт1ту[!бел!!ту]] Удаление записи с информацией о велосипеде выполняется очень просто — достаточно по идентификатору определить номер позиции и удалить запись в этой позиции.
В классе В!КеЯтосК. ВГКеВ!осК не предполагается использовать возможность восстановления удаленных записей, предусматриваемую классом В1пвгуйесогбЕ!1е. ВтпагуйесогбЕ11е. бег цет1теа (вв1Г, !беп!тту): гесогб = ве11. Г!1е[вв!Г. 1пбех Ггоа тбвпт!!у[1бепт1ту]] ге!игл Коле !Г гесогб 1в Моле е1ве (ПКе Ггоа гесагб(гессгб) Записи с информацией о велосипедах извлекаются по идентификатору велосипеда. Если в словаре ве!Г. тпбех Ггоа !бел!!ту отсутствует запротпенный идентификатор, возбуждается исключение КеуБггог, а если запись пустая или была удалена, объект ВтпагуйесогбЕ!1е. ВтпвгуйесогбЕ!1е вернет значение йопе, Но если запись существует, она возвращается в виде объекта В1Ке81осК.
В1Ке. бег сьвпде втаск(ве1Г, тбепт1ту, ваоипт): 1пбех = ве1Г. !пбех Ггса 1бепттту[!бел!!ту] гесогб = ве1Г. Г11е[тпбех] 1Г гесргб тв Капе'. гетпгп Ев1вв Ь!Ке = ЬГКе Ггпа гесьгб(гесьгб) ь!ке.цивпт!ту += ваььпт ве1Г. Г!1в[1пбех] = геспгб Ггоа Ь!Ке(ЬГКе) гетпгп Тгив тпсгевве втоск = (1ваьбв вв1Г, !берт!ту, ваььпт: ве11. Ььвпде втоск(!бепт1ту, ваьипт)) бесгеаве втоск = (1ваьба ве1Г, !бел!!ту, ваоьпт: ве11. сьвпце втоск(!бел!!ту, -ааоппт)) 989 Произвольный доступ к двоичным данным е файлах Частный метод слапде в!сох() содержит реализацию для методов шсгеаве втссК() и Сесгеаве втссК(). Он определяет индекс записи и извлекает ее в двоичном представлении. Затем запись преобразуется в объект В1КеБТОсК.
В1Ке, к этому объекту применяются необходимые изменения, после чего двоичная запись в файле затирается двоичным представлением измененного объекта. (Существует также метод спапде Ь[Ке(), содержащий реализацию методов слапде пзае() и спапде ргтсе(), но ни один из них не будет рассматриваться здесь, так как они очень похожи на методы, продемонстрированные выше.) Свт ттег (ве1Г): Гог тпввх !и гвпде(1еп(ве1(. Тт1е)): гессгп = вв1т.
т!1е[!пзвх] 1Г гесогз тв пот Иоле; у1е1С Ь)ке Ггом гесогп(гесогп) Этот метод обеспечивает возможность итераций через объекты ВзхеБтссх. ВтхеБтссК, как через списки, возвращая на каждой итерации объект ВТКеБ!ОСК. В1Ке и пропуская пустые и удаленные записи. Частные функции Ь[Ке Тгсм гессгс() и гесогС Тгсм ЬТКе() отделяют двоичное представление объектов класса В! КеБТООК. В1Ке от класса ВТКеБтссК. В1КеБТосК, хранящего коллекцию велосипедов. Логическая структура записи с информацией о велосипеде в файле показана на рис. 7.4. Физическая структура записи несколько отличается, потому что каждая запись содержит дополнительный байт состояния.