Саммерфилд - Программирование на Python 3 (1077331), страница 75
Текст из файла (страница 75)
В трех первых разделах этой главы будет использоваться одна и та же коллекция данных: множество записей об авиационных инцидентах. В табл. 7.1 показаны имена и типы данных полей, а также ограничения, накладываемые на записи об авиационных инцидентах. В действительности совершенно неважно, какие данные мы обрабатываем. Для нас сейчас важно научиться обрабатывать фундаментальные типы данных, включая строки, целые числа, числа с плавающей точкой, логические значения и даты — научившись обрабатывать эти типы данных, мы без труда сможем обрабатывать любые другие типы данных.
Таблица 7.Ь Содержимое одной записи в файле данных авиационных инцидентов Ткп данных Примечания Имя Минимальная длина 8 символов, без пробельных символов герогт то зтг Сатетгяе.вате саге Непустое, без символов перевода строки а1грогт зтг Непустое, без символов перевода строки атгсгатт 1С ыг Непустое, без символов перевода строки а1гСГатт турс зтг В диапазоне от 0.0 до 100.0 р11рт регсепт Прргп сп туре 11сат Положительное и ненулевое зна- чения 1пт рт1рт тота1 псргз яыа1г паггат1уе Псс1 Многострочный текст ыг Используя один и тот же набор данных об авиационных инцидентах и сохраняя его в двоичном, текстовом и ХМЬ форматах, мы получаем возможность сравнить различные форматы и объем программного кода, необходимого для работы с ними. В табл.
7.2 приводится число строк программного кода, необходимого для реализации операций чтения и записи в каждом из форматов. 337 Запись и чтение двоичных данных Таблица 7.2. Сравнение средств чтения/записи для формата файлов с данными об авиационных инцидентах Размер выход- ного файла (-Кбайт) Чтение+ запись строк кода Всего строк кода Формат Средство Модуль р!сК1е (со сжатием Ла1р) Модуль ртсК1е Вручную (со сжатием бх(р) Вручную Двоичный Двоичный Двоичный Двоичный Текст 20+ 16 20+ 16 60 + 34 60 + 34 39 + 26 160 416 36 94 132 356 Чтение с использованием регу- лярных выражений, запись вручную 436 Текст Вручную Дерево элементов 53 + 26 37 + 27 44 + 36 55 + 37 436 ХМ1 460 РОМ 60 460 ХМТ Чтение с использованием пар- сера ЗАХ, запись вручную ХМТ 92 464 рвезе: сопуегт-1псьбептя.ру (орт1опя] 1пгт1е оотг!1е неасв а!гсгвгт 1пс!оепт сета ггоа 1пг1!е апс аг!Тев ше сета то опттт1е.
Тсе Сета Гогаетя овео Серепо оп !Не 771е ехтепвтопя: .втх 1я хи!, .в11 тв техт (075-6 епсос!п9), .е15 !в шпагу, .втр тв ртск1е, апс .Ма1 тв нтмк (оп1у а11оаес гог !не оптгт1е). 411 Гогаатя вге р1атгога-!поерепоепт. В примерах используются реальные данные об авиационных инцидентах, которые можно найти на сайте ЕАА (Федеральное авиационное управление правительстве США, шшш.(аа.яоо) В таблице приводятся приблизительные размеры файлов, содержащих записи о 696 авиационных инцидентах.' Размеры сжатых файлов с теми же данными, сохраненными под различными именами, могут отличаться на несколько байтов, так как имена файлов, которые могут иметь разную длину, включаются в состав сжатых данных.
Точно так же могут отличаться размеры файлов ХМЕ, потому что одни средства записи в формате ХМ] замещают кавычки в тексте сущностями (50001; для " и 5зров; для '), а другие — нет. Во всех трех первых разделах рассматривается программный код одной и той же программы: сопоег(-!псЫеп!вру. Эта программа используется для чтения информации об инцидентах в одном формате и для записи в другом формате.
Ниже приводится справочный текст, который выводится программой в консоли. (Мы немного отформатировали текст, чтобы уместить его в ширину книжной страницы.) ззв Глава 7. Работа с файлами бр!топе; -и, --пе1р впош ть!в пе1р веаваде апб ех!! --гогов иг!те тпе оцттт1е ечеп !г !т ех!втв [вегас)т: от!] -ч, --чегьове герог! гевы1(в [бетац1(: от(] -г ЯЕАОЕН, --геабег=НЕАОЕН геабег (ХМЕ): 'бов', 'б', 'етгее', 'е', 'вах', 'в' геабег (тех!): 'вапца1', 'в', 'терех', 'г' [бетац11: етгее гог хмь, вапца1 тог техт! -ш ИЯ1ТЕЯ, --шг!Тег=ИР1ТЕН шгттег (ХМЬ): 'бою', 'б', 'етгее', 'е', 'вапца1', 'в' [бетао11; вапца1] -з, --совргевв совргевв .ать/.атр оотг!1е [бегац11: от(] -т, --тевт ехесцте бостевтв апб ехт! (цзе штть -ч тог чегьове) (Перевод; порядок использования: сопчегт-!по!бел!в.ру [параметры] !птт1е оцтт!1е Читает данные об авиационных инцидентах из файла тпт!1е и записывает их в файл оытт!1е. форматы файлов определяются по их расширениям.
.а!х - ХМ(, .ат! - текст (в кодировке ОТЕ-В), .а!Ь вЂ” двоичный, .а!р - формат модуля рзск1е и .Ьтв1 - ИТИЕ (только для выходного файла оцттт1е). Все форматы являются платформонезависимыми. Параметры: -Ь, --Пе)р --гогов вывести текст этого сообщения и выйти выполнять запись в оытт!1е, даже если он существует [по умолчанию запись в существующий файл не производится] -ч, --чегЬове вывести результаты [по уиолчанию; отключено] -г НЕАОЕЯ, --геабег=НЕАОЕН средство чтения (ХИЬ): 'бов', 'б', 'етгее'. 'е', 'вах', 'в' средство чтения (текст): 'вапыа1', 'в', 'герек', 'г' [по умолчанию: етгее для хме, вапца1 для текста] -и ИН1ТЕН, --шг!тег=ИН1ТЕЯ средство записи (ХМЕ): 'бов', 'б', 'етгее', 'е', 'вапца1', 'в' [по уиолчанию; вапца1] -з, --совргевв сжатие для выходных файлов .а!Ь/.а!р [по умолчанию: отключено] --тевт выполнить доктесты и выйти (для вывода подробного отчета о прохождении тестов используйте параметр -ч) конец перевода) Параметры, используемые программой„более сложные, чем обычно могло бы потребоваться конечному пользователю, которого мало беспокоит, какое средство чтения или записи используется для любого из поддерживаемых форматов.
В более реалистичной версии программы параметры, управляющие выбором средств чтения и записи„отсутствовали бы, и мы просто использовали бы по одному средству чтения и одному средству записи для каждого из форматов. Точно так же в окончательной версии программы отсутствовал бы параметр тестирования, который предоставляется исключительно для того, чтобы мы могли протестировать программный код. Запись и чтение двоичных данных 339 Программа определяет собственное исключение: с1авв 1пс1бепСЕггог(Ехсер11оп): рава Информация об авиационных инцидентах хранится в виде объектов класса 1пстбепС. Ниже приводится строка с инструкцией с1азв и метод инициализации: с1авз 1пс!бепт: бет Сптт (зе11, герогт Сб, басе, а!грег!, а!гога!С 1б, а!гога!С Суре, рт1от регсепт Поогв оп Суре, рт1ос соса1 поогв, а!ба!г, паггас1че=""): аввегт 1еп(герогт 1б) >= З апб 1еп(герогт 1б.вр1!С()) == 1, С "тпча1!о герогс Со" ве11.
герогт 1б = герогт 1б ве1т.баСе = бате ве11 а!грот! = а1грогс ве11 атгсгаГС 1б = атгсгатт тб зе11.а!гога(С Суре = а!гога(С Суре вЕ1т.рт1от рЕгСЕпт Поогв оп СурЕ = р!1от регсепт Псогв оп Суре ве1г.р!1ас соса1 поогв = р11ос соса1 поогв зе1т.п!ба1г = е!ба1г ве1т.паггаСтче = паггаС!че При создании объекта 1пс!бепС проверяется идентификатор отчета и делается доступным только для чтения в виде свойства героС г !б. Все остальные атрибуты данных представляют собой свойства, доступные для чтения и для записи. Например, ниже приводится программный код объявления свойства бате: зргорегсу бет бате(ве!Г): гетогп ве11.
бате ебате.веттег бет бате(зе11, баСе): аввегс !ыпвсапсе(басе, басе!!ее.басе), "1пча1тб басе" ве11. басе = басе Все остальные свойства объявляются точно так же, отличаясь только некоторыми особенностями инструкции аззегС, поэтому мы не будем приводить их здесь. Поскольку для проверки мы используем инструкции авве гС, программа будет завершаться аварийно при любой попытке создать объект 1псгбепС с недопустимыми данными или при попытке записать недопустимое значение в любое из свойств, доступных для чтения/записи. Такой бескомпромиссный подход был выбран потому, что нам необходимо гарантировать допустимость загружаемых и сохраняемых данных, а в случае ошибки нам требуется, чтобы программа сообщала о ней и завершала свою работу, вместо того чтобы просто продолжать работу.
Коллекция данных об инцидентах хранится в объекте типа 1пс!бепССо11есС1оп. Этот класс наследует класс б!сС, благодаря чему мы получа- Глава 7. Работа с файлами ем в свое распоряжение массу функциональных возможностей, таких как поддержка оператора доступа к элементам ([]) для получения, создания и удаления отдельных записей об инцидентах. Ниже приводится строка с инструкцией с1авв и несколько методов класса: с1авв 1пс[пеп1Со11ес11пп(Стет): ает ча1пев(ве11): Гог герогт Ш тп ве11.Кеув(): утв10 ве11[гврогт тп] се( [теав(ве11): гог герог1 тп тп ве1г.квув(): уте10 (герпгт 1с, вв11[герогт [с]) Сет ттег (ве!Г) гог герогт тс тп вогтес(вирег() каув()); утв1С герогт тб Кеув = ттвг, Нам не потребовалось переопределять специальный метод инициализации, потому что вполне достаточно функциональности унаследованного метода Стс1.