Лутц М. - Изучаем Python (1077325), страница 41
Текст из файла (страница 41)
Например, ниже приводится пример строки из пяти символов, содержащей два нуле- вых байта: Глава 7. Строки Руь)1оп вообще нет символа, который служил бы признаком завершения строки. Ниже приводится строка, полностью состоящая из экранированных кодов, — двоичные значения 1 и 2 (записано в восьмеричной форме), за которыми следует двоичное значение 3 (записано в шестнадцатеричной форме): »> в '100110021х03' »> в '1х01>х021х03 ' »> 1ел(а) 3 Это обстоятельство приобретает особую важность, когда возникает необходимость обрабатывать на языке Ру(Ьоп файлы с двоичными данными.
Поскольку содержимое таких файлов в сценариях на языке РуьЬоп представлено строками, вы без труда сможете обрабатывать двоичные файлы, содержащие байты с любыми двоичными значениями (подробнее о файлах рассказывается в главе 9).' Наконец, последняя строка в табл. 7.2 предполагает, что если интерпретатор не распознает символ после х, как корректный служебный символ, он просто оставляет символ обратного олеша в строке: »> х - ""0:~ру~ссое" »> х ' С. '1ХруХхссое ' »> )ел(х) 10 Ф Сяявсл 1 ссхраяеетсх е стрехе Однако если вы не способны держать в памяти всю табл. 7.2, вам не следует полагаться на описанное последней строкой таблицы поведение.' Чтобы явно добавить символ обратного олеша в строку, нужно указать два символа обратного слеша, идущие подряд (хЛ вЂ” экранированный вариант представления символа х,), или использовать неформатированные строки, которые описываются в следующем разделе. Как было показано, экранированные последовательности удобно использовать для вставки в строки служебных символов.
Однако иногда зарезервированная экранированная последовательность может поро- Если вам требуется работать с файлами, содержащими двоичные данные, главное отличие в работе с ними заключается в том, что открывать их нужно в режиме двоичного доступа (добавляя к флагу режима открытии флаг 0, например "го", "иб" и т. д.). Кроме того, обратите внимание на модуль 31 г с сц который будет описан в главе 9, с помощью которого можно выполнять интерпретацию двоичных данных, загруженных из файла.
Мне доводилось встречать людей, которые помнили всю таблицу или большую ее часть. Я бы счел их ненормальными, но пришлось бы себя включить в их число. Неформатированные строки подавляют экранирование Литералы строк ждать неприятности. Очень часто, например, можно увидеть, как начинающие программисты пытаются открыть файл, передавая аргумент с именем файла, который имеет примерно следующий вид: ву(с1е = орел('С:')яви)техт.евс', 'и') думая, что они открывают файл с именем (ех(.с(ас в каталоге С:')пего.
Проблема здесь заключается в том, что последовательность \п интерпретируется как символ новой строки, а последовательность >С замещается символом табуляции. В результате функция орел будет пытаться открыть файл с именем С:(пегойле)еаг((аЬ)ех(.да(, причем обычно безуспешно. Именно в таких случаях удобно использовать неформатированные строки. Если перед кавычкой, открывающей строку, стоит символ г (в верхнем или в нижнем регистре), он отключает механизм зкранирования. В результате интерпретатор РуС)соп будет воспринимать символы обратного слеша в строке как обычные символы.
Таким образом, чтобы ликвидировать проблему, связанную с именами файлов в тй(1пс(о>уз, не забывайте добавлять символ г. вугс1е = орел(г'с:'спеи1свхс.оас', 'и') Как вариант, учитывая, что два идущих подряд символа обратного олеша интерпретируются как один символ, можно просто продублировать символы обратного олеша: вугс1е = орел('с 1Спеис>свис оас', 'и') Сам интерпретатор Рус))оп в определенных случаях использует удваивание обратного олеша при выводе строк, содержащих обратный слеш: »> рвсп = г'с:1пеи1свхс.еас' »> рвсп а Покаэаты как интерпретатор представляет эту строку 'С:11пеи1~сехс, пас ' »> ргспт раСП а более друиественний фариас представления с:>,пеи1сехс.оас »> 1вп(раса) В Алина строки 15 Так же как и в случае с числами, при выводе результатов в интерактивной оболочке по умолчанию используется такой формат представления, как если бы зто был программный код, отсюда и зкранирование символов обратного олеша.
Чтобы проверить, что дело обстоит именно так, можно проверить результат с помощью встроенной функции 1еп, которая возвращает число байтов в строке независимо от формата отображения. Если посчитать символы в выводе инструкции рг1пС расо, можно увидеть, что каждому символу обратно олеша соответствует один байт, а всего строка содержит 1б символов. Помимо хранения имен каталогов в'1)1(1пс(оввз неформатированные строки обычно используются для регулярных выражений (возможность поиска по шаблону, поддерживаемая модулем ге, о котором говорилось 186 Глава 7, Строки в главе 4).
Кроме того, следует отметить, что в сценариях на языке Ру(Ьоп в строках с именами каталогов в системах ЪПпг(отез и (11ч 1Х можно использовать простые символы слеша, потому что Ру$)топ старается поддерживать переносимость для путей к файлам. И все же, когда для кодирования имен каталогов в т(Г(пг(отез используется традиционная нотация с обратными олешами, удобно использовать неформатированные строки. Тройные кавычки, многострочные блоки текста К настоящему моменту мы познакомились с кавычками, апострофами, экранированными последовательностями и неформатированными строками. Кроме этого в арсенале языка РуФЬоп имеется формат представления строковых литералов, в котором используются тройные кавычки. Этот формат иногда называют блочной строкой, которую удобно использовать для определения многострочных блоков текста в программном коде.
Литералы в этой форме начинаются с трех идущих подряд кавычек (или апострофов), за которыми может следовать произвольное число строк текста, который закрывается такими же тремя кавычками. Внутри такой строки могут присутствовать и кавычки, и апострофы, но экранировать их не требуется — строка не считается завершенной, пока интерпретатор не встретит три неэкранированные кавычки того же типа, которые начинают литерал. Например: »> ваптга = """А1веуе 1ооа ... оп тае Ьг1ОПС е1ае от 11те.""" »> »> ваптге 'А1вауа 1ооптп оп тле Ог1дат~патсе от 11те.' Эта строка состоит из трех строк (в некоторых системах строка приглашения к вводу изменяется на..., когда ввод продолжается на следующей линии; среда 101.Е просто переводит курсор на следующую линию).
Интерпретатор собирает блок текста, заключенный в тройные кавычки, в одну строку, добавляя символы новой строки (тп) там, где в программном коде выполнялся переход на новую строку. Обратите внимание, что в результате у второй строки имеется ведущий пробел, а у третьей— нет, то есть что вы в действительности вводите, то н получаете. Строки в тройных кавычках удобно использовать, когда в программе требуется ввести многострочный текст, например, чтобы определить многострочный текст сообщения об ошибке или код разметки на языке НТМЬ нли ХМЕ. Вы можете встраивать такие блоки текста прямо в свои сценарии, не используя для этого внешние текстовые файлы или явную операцию конкатенации и символы новой строки.
Часто строки в тройных кавычках используются для создания строк документирования, которые являются литералами строк, воспринимаемыми как комментарии при появлении нх в определенных местах 187 Литералы строк сценария (подробиее о иих будет рассказываться позже в этой книге).
Комментарии ие обязательно (ио часто!) представляют собой многострочиый текст, и данный формат дает возможность вводить многострочные комментарии. Наконец, иногда тройные кавычки являются ужасающим, хакерским способом временного отключения строк программного кода во время разработки (Хорошо, хорошо! На самом деле это ие так ужасно, и в действительиости довольно распространенная практика). Если вам потребуется отключить несколько строк программного кода и запустить сценарий снова, просто вставьте по три кавычки до и после нужного блока кода, как показано ниже: к=1 тарогт оо ргтот оа.оетоио() У = 2 Я назвал этот прием ужасным, потому что при работе интерпретатор вынужден создавать строку из таких линий программного кода, ио, скорее всего, это слабо сказывается иа производительности.
В случае крупных блоков программного кода использовать этот прием гораздо удобнее, чем вставлять символы решетки в начале каждой строки, а затем убирать их. Это особенно верно, если используемый вами текстовый редактор ие поддерживает возможиость редактирования исходиых текстов на языке Ру1Ьоп. При программировании иа этом языке практичность часто берет верх иад эстетичиостью. Строки символов Юникода позволяют использовать крупные наборы символов Последний способ создания строк в сценариях является, пожалуй, самым специфичным, и ои редко используется за пределами задач обработки кода разметки ХМЬ и веб-программироваиия.
Строки символов Юникода иногда называют строками «широких» символов. Так как символы Юиикода могут быть представлены более чем одним байтом, такие строки могут обеспечить представление более широкого набора символов, чем стандартные строки. Строки символов Юиикода обычно используются с целью поддержки интернационализации приложений (ииогда называется как «П8п«, чтобы сжать 18 символов, расположенные между первым и последним символом в слове «1п1егпа11опа11за11оп«).
Например, оии позволяют программистам непосредствеиио использовать в сценариях символы из европейских и азиатских алфавитов. Поскольку такие наборы могут содержать больше символов, чем можно представить с помощью однобайтовой кодировки, то для обработки таких видов текста обычно используется Юиикод. 1ВВ Глава 7. Строки В языке Руь)топ строки символов Юникода можно записывать, добав- ляя символ У (в верхнем или нижнем регистре) перед открывающей кавычкой: »> с враз о'враю' Формально с помощью этого синтаксиса создается объект строки символов Юникода, который является самостоятельным типом данных, отличным от обычного строкового типа.
Однако Рув)топ позволяет легко смешивать в выражениях строки символов Юникода и обычные строки, преобразуя последние до строк символов Юникода при вычислении результата (подробнее об операции конкатенации рассказывается в следующем разделе): »> 'п1' ч и'враз' № Сиеюивание строк различнык типов о'птвраа' № Из Юникодв в обычную строку № Из обычной строки в Юникод »> втг(о араа ) 'враз' »> оп1соба('враз') о'враз' Поскольку кодировка Юникод предназначена для работы с многобай- товыми символами, вы также можете использовать экранированные последовательности ч,о н ч,о для представления символов Юникода в виде числовых значений, размер которых превышает 8 битов: № В-битовые/т-байтовые сииволы № 2-байтовые сиивопы »> о'аьтхгосб' о'аЬ сб' >» о'аь\воогосб' и аЬ сб' »> и ас|000000020сб о'аЬ сб' № 4-байтовые сиивопы Первая из этих инструкций встраивает числовой код символа пробела, который в шестнадцатеричной записи имеет вид хгО.