Главная » Просмотр файлов » Саммерфилд - Программирование на Python 3

Саммерфилд - Программирование на Python 3 (1077331), страница 78

Файл №1077331 Саммерфилд - Программирование на Python 3 (Саммерфилд - Программирование на Python 3) 78 страницаСаммерфилд - Программирование на Python 3 (1077331) страница 782018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 78)

Большинство символов представляют значение определенного типа. Если имеется несколько значений одного и того же типа, мы можем записать символ требуемое число раз ("ЬЬ") или указать количество значений перед символом, как это сделано в примерах выше ("2Ь" ). приводится начало функции ехрогС Ьспагу() и полное определение функции расК зтгспд(): Глава 7.

Работа с файлами В электронной документации к модулю вт сост описывается множество символов формата, включая «Ь» (8-битовое целое число со знаком), «В» (8-битовое целое число без знака), «Ь» (16-битовое целое число со знаком — используется в примерах выше), «Н» (16-битовое целое число без знака), «1» (32-битовое целое число со знаком), «1» (32-битовое целое число без знака), «с(» (64-битовое целое число со знаком), «Йе» (64-битовое целое число без знака), «1» (32-битовое число с плавающей точкой), «д» (64-битовое число с плавающей точкой — соответствует типу (1оат в языке РуСЬоп), «2» (логическое значение), «в» (объект типа Ьутев или Ьутеа ггау — строки байтов) и многие другие.

Для некоторых типов данных, таких как многобайтовые целые числа, большое значение имеет порядок следования байтов. Мы можем принудительно использовать какой-то определенный порядок следования байтов независимо от порядка следования байтов, используемого аппаратной архитектурой, для чего строка формата должна начинаться с символа, определяющего порядок следования байтов. В атой книге мы везде будем использовать символ «<», обозначающий обратный порядок следования байтов, который используется в широко распространенных процессорах 1пбе1 и АМП. Прямой порядок следования байтов (иногда его называют сетевым порядком следования байтов) обозначается символом «>» (или «1»). Если порядок следования байтов не указан явно, применяется порядок, используемый аппаратной архитектурой машины.

Мы рекомендуем всегда явно указывать порядок следования байтов, даже если он совпадает с аппаратным, так как это обеспечит более высокую переносимость. Функция вт сост. са1св(ае() принимает строку формата и возвращает количество байтов, которые займет структура указанного формата. Строку формата можно также сохранить, создав объект типа вт гссс. От гост( ), передав строку формата в виде аргумента, а размер объекта 91гвст. Ятгост() можно получить, обратившись к его атрибуту в(ге.

Например: ТНО ОНОНТО = атсвст. Отшст("сгл") Ната = ТНО ОНОНТЗ.раен(11, -9) а Сага == а'т,хОВ'тхззт,хттт,хтт' атаев = тно Ононтз.вар»си(вата) а Ттезв == (11, -9) В обоих примерах число 11 в шестнадцатеричном представлении имеет вид ОхОООЬ, но оно преобразуется в последовательность байтов ОИОЬ Охоо, потому что мы использовали обратный порядок следования байтов.

Запись и чтение двоичных данных Функция расК асг!по() может обрабатывать строки, содержащие до 65535 символов в кодировке УТг -8. Мы легко могли бы использовать другой тип целого числа для хранения числа байтов, например, 4-байтовое целое число со знаком (формат «1») позволило бы обрабатывать строки, содержащие до 2"-1 (более 2 миллиардов) символов. Модуль асгос1 предоставляет похожий встроенный формат, «р», описывающий строки, в которых первый байт используется в качестве счетчика символов, применив который мы смогли бы обрабатывать строки, содержащие до 255 символов.

Программный код, выполняющий упаковывание строк с применением формата «р», выглядит намного проще. Но формат «р» ограничивает максимально возможную длину строк 255 символами Т)Тг-8 и практически не дает преимуществ при распаковывании. (Исключительно ради сравнения в файл с исходными текстами сопиегт-тс(г(енса ру включены версии функций расК асыпр()и опрасК асг(пр().) Теперь можно все наше внимание переключить на остальную часть программного кода в методе ехрогс ь(сагу().

СЬ = Иопе сгу: 1г соаргеаа.' СЬ = сыр.ореп(тс1епаае, тиЬ") е1ае: СЬ = ореп(11!епаае, тиЬ") ГЬ.»Гссе(ИА61С) Гь.иг!СЕ(ЕОВИАТ ЧЕИС10И) гог !пссбепс 1п ае1(.ча1оеа(): баСа = Ьусеаггау() ба1а.ех1епб(раск а1г1по(!пс1бепс.герог1 !б)) баса.ехсепб(раск асг!по(!пс!бесс.а!гросс)) баса.ехсепб(расК асыпр(!псгбеп1.асгсгат1 !б)) ба1а.ехсепб(раск а1гспо(1пссбеп1.асгсгагс суре)) ба1а.ех1епб(расК асг!пр(!пссбепс.пагга11че.атг!р())) баса.ехсепб(иоаьегаьсгосс.раск( спс1бепт. бате. 1оогб1па1(), 1пс1бепС.р!1от регсепт поста оп туре, спссбепс,рс1ос со1а1 поога, !пс!бесс.а!ба!г)) гп.нюсе(баса) гетигп Тгое Мы опустили блоки ехсер1 и т(па11у, потому что они остались такими же, как и в предыдущем подразделе, кроме собственно исключений, обрабатываемых в блоке ехсерс.

В самом начале мы открываем файл для записи в двоичном режиме либо как обычный файл, либо как сжатый файл, в зависимости от значения флага совргеаа. Затем записываются 4-байтовая сигнатура, уникальная (надеемся) для нашей программы, и 2-байтовый номер вер- Глава 7. Работа с файлами сии.' Предусмотрев номер версии, мы упрощаем возможность изменения формата в будущем — прочитав номер версии, мы сможем определить, какой программный код использовать для чтения файла.

Затем выполняется обход всех записей об инцидентах, и для каждой создается объект типа Ьугеа ггау. Каждый элемент данных добавляется в массив байтов, начиная со строк переменной длины. Метод сз(е, гссгз1па1() возвращает единственное целое число, представляющее сохраняемую дату. Позднее дату можно будет восстановить, передав это целое число методу саге()ве, пасе. Ггозсгл(ла1(). Объект йиясегз81гис( был определен выше в программе следующей инструкцией: ниэсегэбыисг = эыэс1. зыисг(Г<101т') Этот формат определяет обратный порядок следования байтов„32-битовое целое число без знака (для хранения даты), 64-битовое число с плавающей точкой (налет на данном типе самолетов в процентах от общего времени налета пилота), 32-битовое целое число (общее время налета пилота в часах) и логическое значение (прнзнак того, что инцидент произошел в воздухе).

Структура записи об авиационном инциденте схематически изображена на рис. 7.1. После заполнения объекта су1ез ггзу полной информацией об одном инциденте производится запись объекта на диск. После записи всех инцидентов возвращается значение Тгсе (здесь предполагается, что в процессе записи не возникло никаких ошибок). Блок (1лз11у гарантирует закрытие файла перед тем, как управление будет возвращено вызывающей программе.

Чтение данных выполняется не так просто, как их запись, потому что при чтении приходится выполнять ббльшее количество проверок на Рис. 7.1. Структура записи об авиационном инциденте в двоичном формате Нигде не существует центрального репозитария сигнатур, какой существует, например, для доменных имен, поэтому мы никогда не можем гарантировать их уникальность. Эапись и чтение двоичных данных наличие ошибок. Кроме того, чтение строк переменной длины сопряжено с определенными сложностями. Ниже приводится часть метода сврогс 0!пагу() и полное определение функции опраск асыпц(), которая используется для чтения строк переменной длины: Оес !враг! Шпагу(аа1Г, Г11апаве): 0аг опраск асгспц(пь аог са еггаг=тгое): О1ПС16 = аСГОСС.ЗСГОСС(схн") 1епдСП за!а = Го.гаао(о!пттб.асга) ст ппт 1апцСП баСа: 1Г епт са аггог: га1аа на1оаеггог("всаа1пд пг соггорс асг!пд а!са") гетогп Хопа !епцсп = шпс16,опраск(1апдсп паса)(0) ст 1епцСП == 0: гасогп "" паса = гп.гааз(1епдсп) тс прт пата пг 1ап(ааса) != 1епдсп: га!аа На1оаЕггог( 'вгааспц аг соггорс асгспд") гогвас = тх(0)а" гогвас(1епдсп) гесогп асгосс.опраск(гогвас, паса)(0).оесооа("оста") Поскольку каждая запись об инциденте начинается строкой идентификатора, следовательно, когда попытка чтения строки идентификатора оканчивается успехом, зто означает, что было начато чтение новой записи.

Неудача означает, что достигнут конец файла и можно прекращать чтение. При попытке прочитать строку идентификатора отчета в аргументе еос 16 еггог передается значение Ра1ае; в этом случае отсутствие данных будет означать просто окончание операции чтения. При чтении всех других строк аргумент еог 16 еггог получает значение по умолчанию Тгое, потому что отсутствие данных для любых других строк означает ошибку. (Даже пустой строке будет предшествовать 1б-битовое целое число без знака, обозначающее длину строки.) Чтение строки начинается с попытки прочитать ее длину. Если зта попытка терпит неудачу, вызывающей программе возвращается значение ((опе, чтобы сообщить о достижении конца файла (если производится попытка прочитать новую запись), или возбуждается исключение На1оеЕг гог, чтобы сообщить о повреждении или об отсутствии данных.

Функция атгост.опрасК() и метод атгосС.В!гост.опрасК() всегда возвращают кортеж, даже если он содержит единственное значение. Мы извлекаем значение длины строки н сохраняем его в переменной 1епдсп. Теперь известно, сколько байтов следует прочитать из файла, чтобы получить строку. Если длина равна нулю, функция просто возвращает пустую строку.

В противном случае производится попытка прочитать заданное число байтов. Если в результате попытки чтения было получено меньшее число байтов или вообще ничего не было получено, возбуждается исключение На1оеЕ г го г. Глаза 7. Работа с файлами Если было прочитано требуемое количество байтов, создается соответствующая строка формата для функции з! гост. опрасН() и вызывающей программе возвращается строка с извлеченными данными, представляющая результат декодирования байтов с использованием кодировки ТТТУ-8.

(Теоретически последние две строки можно было бы заменить инструкцией гетр гп бата. Оесозе("от!-8"), но мы предпочли пройти через процесс распаковывания, так как вполне возможно, хотя и маловероятно, что формат «е» выполняет некоторые преобразования, которые должны быть применены к данным при чтении.) Теперь рассмотрим оставшуюся часть метода 1аро г! Ь1па гу( ), разбив ее на две части для простоты объяснения. гп = попе !гу; гп = преп(гт1епазе, "гь") зад!с = Гп.гааз(!ап(621Р МА61С)) тт зад!с == 621Р МА61С: Гп.с1ове() ГЬ = дг!р.преп(тт1епаае, "го") е1ве: Гп.зева(0) зад!с = ГЬ. геаа( 1еп(ИА61С)) 1Г зад!с != ИА61С: гатве На1иеЕггог("1пча11О .а1Ь Г11е Гогаат") чегв1оп = Тп,гааз( 1еп(РОНМАТ НЕН610И)) тт чего!оп > ЕОНМАТ НЕН610И; га1зе На1оеЕггог("опгасодп!вас .а!Ь Гт1е чегз1оп") ве1(.с1еаг() Файл может быть сжатым, поэтому здесь используется тот же прием, что использовался при чтении файла с законсервированным объектом,— открытие файла либо с помощью функции дг(р,орел(), либо с помощью встроенной функции орел().

После открытия файла производится чтение первых четырех байтов (1еп(МА61С)). Если они не соответствуют нашей сигнатуре, это говорит о том, что файл не является двоичным файлом с информацией об авиационных инцидентах, и поэтому возбуждается исключение На1оеЕ г го г. Затем производится чтение двух байтов с номером версии. С этого момента можно было бы реализовать различные процедуры чтения— в зависимости от номера версии.

Сейчас же просто проверяется, не является ли номер версии более поздним, чем тот, что может быть прочитан программой. Если сигнатура оказалась верной и номер версии соответствует тому, что может быть обработан, можно приступать к чтению данных, поэтому производится удаление всех существующих элементов с информацией об инцидентах. чая1е Тгое: герогт 1О = оправа втг!пд(ГЬ, Еа1зе) Эапись и чтение двоичных данных тт герог1 тб тп Испе: Ьгеах баСа = () ба1а["герог1 тб"] = герогт !б Гог паве тп ("а!грот!", "атгсгат1 тг)", "атгсгатт суре", "пагга11уе"); ба1а[паве] = ппраск зтгшр(ть) 01пег бата = Гь.геаб(йбппегп81гибт.в!ге) ппвпегп = йивьегп81гист.ипрасх(о1Пег ба1а) ба1а["бате"] = бате1тве.бате,ггьвьгб1пацпивьегз[0]) бата["рт1от регсеш поигп оп туре"] = повьете[1] бата[ "рт1от тста1 поигп" ] = пивьегп[2] ба1а["втбатг"] = повьете[3] !пбтбепт = 1пстбеп1( *бата) пе11[тпстбеп1.герогт !б] = тпстбеп1 гетигп Тгпе Тело цикла нйт1е выполняется, пока не будут исчерпаны все данные.

Характеристики

Тип файла
DJVU-файл
Размер
6,88 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6447
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее