Саммерфилд - Программирование на Python 3 (1077331), страница 25
Текст из файла (страница 25)
Кроме того, для одной и той же кодировки может иметься множество альтернативных названий: например, названия «1а$1п», «1а11п1», «1а11п 1», «180-8859-1», «СР819» и некоторые другие обозначают кодировку «Ьа11п-1». Метод может также принимать второй необязательный аргумент, который сообщает, как следует обрабатывать ошибки. Например, мы можем закодировать любую строку в кодировке АЯСП, передав во втором аргументе «1япоге» или «гер1асе» вЂ” ценой потери данных, или без потерь, передав строку «Ьасйэ!авЬгер1асе» вЂ” в этом случае символы, не входящие в набор АЯСП, будут представлены последовательностями т,х, 'ти и 19.
Например, вызов агттэт, епсоое("аэст1", "тдпоге") вернет Ь'Таце эп', вызов агттэт, спсосс("аэс(1", "гер1асс" ) вернет ь'таце?э?и ', а вызов агт(эт. епсоОе("аэс1т", "Ьаскэ1аэпгер1зсе" ) вернет Ь'Таце тхс5этхецп '. (Точно так же мы могли бы получить строку АЯСП-символов с помощью вызова "(О! а)". (сгват(агт(эт), который вернет 'Таце тхс5зтхедп'.) В дополнение к методу эт г.
епсоде() имеется метод Ьутеэ. беседе( ) (а также Ьутеаггау. беседе()), который возвращает строку с байтами, декодированными при помощи заданной кодировки. Например: »> ртпт(ь"таце т,хсз~х55»т,хсзт,ха9п".овсове("итгэ")) Та9е 1эеп »> ртпт(ь"таце т,хс5этхецп".Овсове("1аттпт")) Та9е 4эп Различия между 8-битовыми кодировками Ьа11п-1, СР850 (кодировка 1ВМ РС) и кодировкой 1)ТУ-8 очевидно доказывают, что выбор кодировки наугад едва ли может считаться успешной стратегией. К счастью, кодировка Т)ТУ-8 фактически уже стала стандартом для простых текстовых файлов, благодаря чему следующие поколения, вероятно, даже не узнают, что некогда существовали другие кодировки.
Для файлов с расширением .ру используется кодировка Т)ТУ-8, поэтому Ру1Ьоп всегда знает, какая кодировка используется для представления строковых литералов. Это означает, что мы можем использовать в своих строках любые символы Юникода, поддерживаемые нашим текстовым редактором.' Когда РуЬЬоп читает данные из внешних источников, например нз сетевых сокетов, он не может заранее знать, какая кодировка используется, Вполне возможно испольэовать и другие кодировки. Подробности можно найти в документе «Ру$Ьоп ТпФог1а1», в разделе «Яопгсе Со«(е Епсод1пя». (/тггрт//г)осв руг/топ.ого/3.0/»итог(а(/тпгегргегег.И1т1№воигве.сот(е-еьсог(ту.— Прим. перев.) 116 Глава 2, Типы данных поэтому он возвращает байты, которые мы можем декодировать нужным образом.
В отношении текстовых файлов Руьпоп использует более дружественный подход, используя локальную кодировку, если мы не указываем ее явно. К счастью, некоторые форматы файлов явно определяют свою кодировку. Например, мы можем предположить, что ХМЬ-файл использует кодировку Т)ТУ-8, если в нем отсутствует директива <~хв1?>, явно указывающая другую кодировку.
Поэтому при чтении ХМЬ-файлов мы можем извлекать, скажем первые 1000 байтов, отыскивать определение кодировки и, если оно присутствует, декодировать содержимое файла в соответствии с указанной кодировкой; в противном случае переходить на использование кодировки ()ТР-8. Такой прием должен срабатывать для любых ХМЬ-файлов или простых текстовых файлов, в которых используется любая из однобайтовых кодировок, поддерживаемых РуЬЬоп, за исключением кодировок, основанных на ЕВСТ)1С (СР424, СР500), и некоторых других (СР037, СР864, СР865, СР1026, СР1140, Н2, ЯН1РТ- Т18-2004, ЯН1УТ-ЛЯХ0213). К сожалению, такой подход неприменим в случае использования многобайтовых кодировок (таких как ()ТУ-16 и ()ТУ-32). В каталоге пакетов Ру$поп (Руьпоп Расхаде 1пдех), рурйру(аоп.огу(рурд имеется по крайней мере два пакета, позволяющих автоматически определять кодировку файлов.
Примеры В этом разделе мы будем использовать знания, полученные в этой и в предыдущей главах, чтобы представить две маленькие, но законченные программы, соединяющие в себе все, что мы узнали до сих пор. Первая программа имеет некоторое отношение к математике, но она очень короткая и занимает всего 35 строк.
Вторая связана с обработкой текста и имеет более существенный объем — в ней определяется семь функций и содержит она около 80 строк программного кода. с~ца(лгал! с.ру Квадратные уравнения — это уравнения вида ах'+ Ьх+ с = О, где а э О, описывающие параболу. Корни таких уравнений находятся по формуле — ЬЬ Ь вЂ” 4ас 2 х = 2а Часть формулы Ь'-4ас называется дискриминантом — если это положительная величина, уравнение имеет два действительных корня, если дискриминант равен нулю — уравнение имеет один действительный корень, и в случае отрицательного значения уравнение имеет два комплексных корня. Мы напишем программу, которая будет принимать Примеры от пользователя коэффициенты а, Ь и с (коэффициенты Ь и с могут быть равны нулю) и затем вычислять и выводить его корень или корни.' Для начала посмотрим, как работает программа, а потом перейдем к изучению программного кода.
Спаага11с.ру ах' + Ьх + с = 0 епгег а: 2.5 еп1ег Ь: 0 еп1ег с: -7.25 2.5х' т 0.0х т -7.25 = 0 -+ х = 1.70293863659 сг х = -1.70293863659 С коэффициентами 1.6, -3 и 6 программа выведет (некоторые цифры обрезаны): 1. 5х' + -3.0х т 6.0 = 0 -+ х = (1+1.7320508)) ог х = (1-1.7320508)) Вывод программы не так хорош, как хотелось бы — например, вместо а -3. Ох лучше было бы выводить -3. Ох, а коэффициенты, равные нулю,— вообще не показывать.
Вы получите шанс ликвидировать эти недостатки при выполнении упражнений. Теперь обратимся к программному коду, который начинается тремя инструкциями гарогг: аврогт саа1П аврог1 ааСП 7ВРОГ1 ВУВ Нам необходимы обе математические библиотеки для работы с числами типа 71081 и соэр1ех, так как функции, вычисляющие квадратный корень из вещественных и комплексных чисел, отличаются.
Модуль вув нам необходим, так как в нем определена константа вув. 71081 1п- 70. ерв11оп, которая потребуется нам для сравнения вещественных чисел со значением О. Нам также необходима функция, которая будет получать от пользователя число с плавающей точкой: СвГ дег 71оаг(авд, а11сх гего): х = Нэпе хп11в х 1в Нэпе; 1гу: х = 71саг(1прпг(авд)) Поскольку консоль в операционной системе х(71пбокгв имеет весьма ограниченную поддержку 1)ТР-8, а консоль в системе Мас 08 Х по умолчанию использует кодировку Арр1е Вотан, существует две проблемы с символами ' н -+, которые используются программой диаг(гаГ)суру.
Мы включили в примеры файл диас)гаг)с иа).ру, который отображает корректные символы в консоли Ыпих н использует нх заменители ( 2 н ->) в других системах. Глава 2. Типы данных !Т паг а11ох лего апп аЬв(х) < вув. Г1оа1 1п(о.ерю1оп: рг!пг(таего гв по1 а11онеп") х = йопе ЕхСЕР1 Ча)оеЕггог ав егг: рггпг(егг) гЕгпгп х Эта функция выполняет цикл, пока пользователь не введет допустимое число с плавающей точкой (например, 0.5, -9, 21, 4.92), и допускает ввод значения О, только если аргумент а))он !его имеет значение Тгое. Вслед за определением функции де! (1оа1() выполняется оставшаяся часть программного кода, Мы разделим его на три части и начнем со взаимодействия с пользователем: рг!п1("ахай(ЕОРЕНЗСН1РТ ТХО) + Ьх г с = 0") а = Ое( (1оа1("еп(ег а: ", Ра1ве) ь = де1 11оа1("епгег ь: ", тгое) с = де( (1оа1("еп1ег с: ", тгое) Благодаря функции дег Г1оа1() получить значения коэффициентов а, Ь и с оказалось очень просто.
Второй аргумент функции сообщает, когда значение О является допустимым. х1 = йопе х2 = йопе огвсггпгпапг = (ь " 2) — (4 а . с) г( О!всггегпапг == 0: х1 = -(Ь г (2 а)) е1ве: гГ О!всг1агпапг > 0: гоо! = аа(л.вцг1(О!всг!егпап1) е1ве: а Огвсые1пап( < 0 гоо1 = сеагп.вцг((о>всггегпап() х1 = (-Ь + гоо() у (2 ° а) х2 = (-Ь - гоог) г (2 * а) Программный код выглядит несколько иначе, чем формула, потому что мы начали вычисления с определения значения дискриминанта.
Если дискриминант равен О, мы знаем, что уравнение имеет единственное действительное решение и можно сразу же вычислить его. В противном случае мы вычисляем действительный или комплексный квадратный корень из дискриминанта и находим два корня уравнения.
ецоа1гоп = ("(0)хгй[ЗОРЕНЯСНТРТ ТИО) г (1)х г (2) = 0" "1й(НТОНТНПНОН ПННОй) х = (З)").Гогеа((а, Ь, с, х1) гг х2 !в по1 йапе. ецоа11оп += " ог х = (0)".Тогаа((х2) рып((ецоа(1оп) Мы не использовали сколько-нибудь сложного форматирования, поскольку форматирование, используемое по умолчанию для чисел с плавающей точкой в языке Ру1)(оп, прекрасно подходит для этого приме- 119 Примеры ра, но мы использовали некоторые имена Юникода для вывода пары специальных символов. СЯЧ261П)1.РУ Часто бывает необходимо представить данные в формате НТМ! . В этом подразделе мы разработаем программу, которая читает данные из файла в простом формате СЯЧ (Сопппа Яерагабе<( Ча1пе — значения, разделенные запятыми) и выводит таблицу НТМЬ, содержащую эти данные.