Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 56
Текст из файла (страница 56)
Следующая строкасодержит символы “spam”, символ табуляции и символ новой строки, а такженулевой символ, заданный в шестнадцатеричном представлении:>>> S = “s\tp\na\x00m”>>> S‘s\tp\na\x00m’>>> len(S)7>>> print(S)s pa mЭто обстоятельство приобретает особую важность, когда возникает необходимость обрабатывать на языке Python файлы с двоичными данными. Поскольку содержимое таких файлов в сценариях на языке Python представленостроками, вы без труда сможете обрабатывать двоичные файлы, содержащиебайты с любыми двоичными значениями (подробнее о файлах рассказываетсяв главе 9).11Если вам требуется работать с файлами, содержащими двоичные данные, главное отличие в работе с ними заключается в том, что открывать их нужно в режиме двоичного доступа (добавляя к флагу режима открытия флаг b, например “rb”, “wb” и такдалее).
В Python 3.0 содержимое двоичных файлов интерпретируется как коллекция строк типа bytes, которые по своим возможностям напоминают обычные строки.В Python 2.6 содержимое таких файлов интерпретируется как коллекция обычныхстрок типа str. Кроме того, обратите внимание на модуль struct, который будет описан в главе 9, с помощью которого можно выполнять интерпретацию двоичных данных, загруженных из файла. Расширенное описание принципов работы с двоичными файлами и строками байтов приводится в главе 36.214Глава 7. СтрокиНаконец, последняя строка в табл. 7.2 предполагает, что если интерпретаторне распознает символ после \ как корректный служебный символ, он простооставляет символ обратного слеша в строке:>>> x = “C:\py\code”>>> x‘C:\\py\\code’>>> len(x)10# Символ \ сохраняется в строкеОднако если вы не способны держать в памяти всю табл. 7.2, вам не следуетполагаться на описанное поведение.1 Чтобы явно добавить символ обратногослеша в строку, нужно указать два символа обратного слеша, идущие подряд(\\ – экранированный вариант представления символа \), или использовать неформатированные строки, которые описываются в следующем разделе.Неформатированные строки подавляют экранированиеКак было показано, экранированные последовательности удобно использоватьдля вставки в строки служебных символов.
Однако иногда зарезервированнаяэкранированная последовательность может порождать неприятности. Оченьчасто, например, можно увидеть, как начинающие программисты пытаютсяоткрыть файл, передавая аргумент с именем файла, который имеет примерноследующий вид:myfile = open(‘C:\new\text.dat’, ‘w’)думая, что они открывают файл с именем text.dat в каталоге C:\new. Проблемаздесь заключается в том, что последовательность \n интерпретируется как символ новой строки, а последовательность \t замещается символом табуляции.В результате функция open будет пытаться открыть файл с именем C:(newline)ew(tab)ext.dat, причем обычно безуспешно.Именно в таких случаях удобно использовать неформатированные строки.Если перед кавычкой, открывающей строку, стоит символ r (в верхнем илив нижнем регистре), он отключает механизм экранирования.
В результате интерпретатор Python будет воспринимать символы обратного слеша в строке какобычные символы. Таким образом, чтобы ликвидировать проблему, связаннуюс именами файлов в Windows, не забывайте добавлять символ r.myfile = open(r’C:\new\text.dat’, ‘w’)Как вариант, учитывая, что два идущих подряд символа обратного слеша интерпретируются как один символ, можно просто продублировать символы обратного слеша:myfile = open(‘C:\\new\\text.dat’, ‘w’)Сам интерпретатор Python в определенных случаях использует удваивание обратного слеша при выводе строк, содержащих обратный слеш:>>> path = r’C:\new\text.dat’>>> path# Показать, как интерпретатор представляет эту строку1Мне доводилось встречать людей, которые помнили всю таблицу или большую еечасть. Я мог бы посчитать их ненормальными, но тогда мне пришлось бы себя тожевключить в их число.215Литералы строк‘C:\\new\\text.dat’>>> print(path)C:\new\text.dat>>> len(path)15# Более дружественный формат представления# Длина строкиТак же как и в случае с числами, при выводе результатов в интерактивной оболочке по умолчанию используется такой формат представления, как если быэто был программный код, отсюда и экранирование символов обратного слеша.Инструкция print обеспечивает более дружественный формат, в котором каждая пара символов обратного слеша выводится как один символ.
Чтобы проверить, что дело обстоит именно так, можно проверить результат с помощьювстроенной функции len, которая возвращает число байтов в строке независимо от формата отображения. Если посчитать символы в выводе инструкцииprint(path), можно увидеть, что каждому символу обратного слеша соответствует один байт, а всего строка содержит 15 символов.Помимо хранения имен каталогов в Windows, неформатированные строкиобычно используются для регулярных выражений (возможность поиска пошаблону, поддерживаемая модулем re, о котором говорилось в главе 4).
Крометого, следует отметить, что в сценариях на языке Python в строках с именамикаталогов в системах Windows и UNIX можно использовать простые символыслеша, потому что Python старается поддерживать переносимость для путейк файлам (например, путь к файлу можно указать в виде строки ‘C:/new/text.dat’). И все же, когда для кодирования имен каталогов в Windows используетсятрадиционная нотация с обратными слешами, удобно использовать неформатированные строки.Несмотря на свое предназначение, даже неформатированнаястрока не может заканчиваться единственным символом обратного слеша, потому что обратный слеш в этом случае будет экранировать следующий за ним символ кавычки – вы по-прежнемудолжны экранировать кавычки внутри строки.
То есть конструкция r”...\” не является допустимым строковым литералом – неформатированная строка не может заканчиваться нечетным количеством символов обратного слеша. Если необходимо, чтобы неформатированная строка заканчивалась символомобратного слеша, можно добавить два символа и затем удалитьвторой из них (r’1\nb\tc\\’[:-1]), добавить один символ вручную(r’1\nb\tc’ + ‘\\’) или использовать обычный синтаксис строковых литералов и дублировать все символы обратного слеша (‘1\\nb\\tc\\’). Во всех трех случаях получается одна и та же строка извосьми символов, содержащая три обратных слеша.Тройные кавычки, многострочные блоки текстаК настоящему моменту мы познакомились с кавычками, апострофами, экранированными последовательностями и неформатированными строками.
Кроме этого в арсенале языка Python имеется формат представления строковыхлитералов, в котором используются тройные кавычки. Этот формат иногданазывают блочной строкой, который удобно использовать для определениямногострочных блоков текста в программном коде. Литералы в этой форме на-216Глава 7. Строкичинаются с трех идущих подряд кавычек (или апострофов), за которыми может следовать произвольное число строк текста, который закрывается такимиже тремя кавычками. Внутри такой строки могут присутствовать и кавычки,и апострофы, но экранировать их не требуется – строка не считается завершенной, пока интерпретатор не встретит три неэкранированные кавычки того жетипа, которые начинают литерал. Например:>>> mantra = “””Always look... on the bright...
side of life.”””>>>>>> mantra‘Always look\n on the bright\nside of life.’Эта строка состоит из трех строк текста (в некоторых системах строка приглашения к вводу изменяется на ..., когда ввод продолжается на следующейлинии; среда IDLE просто переводит курсор на следующую линию).
Интерпретатор собирает блок текста, заключенный в тройные кавычки, в одну строку,добавляя символы новой строки (\n) там, где в программном коде выполнялсяпереход на новую строку. Обратите внимание, что в результате у второй строкиимеется ведущий пробел, а у третьей – нет, то есть, что вы в действительностивводите, то и получаете. Чтобы увидеть, как в реальности интерпретируетсястрока с символами новой строки, можно воспользоваться инструкцией print:>>> print(mantra)Always lookon the brightside of life.Строки в тройных кавычках удобно использовать, когда в программе требуется ввести многострочный текст, например чтобы определить многострочный текст сообщения об ошибке или код разметки на языке HTML или XML.Вы можете встраивать такие блоки текста прямо в свои сценарии, не используя для этого внешние текстовые файлы или явную операцию конкатенациии символы новой строки.Часто строки в тройных кавычках используются для создания строк документирования, которые являются литералами строк, воспринимаемыми как комментарии при появлении их в определенных местах сценария (подробнее о нихбудет рассказываться позже в этой книге).
Комментарии не обязательно (но часто!) представляют собой многострочный текст, и данный формат дает возможность вводить многострочные комментарии.Наконец, иногда тройные кавычки являются ужасающим, хакерским способом временного отключения строк программного кода во время разработки(Хорошо, хорошо! На самом деле это совсем не так ужасно, а просто довольно распространенная практика). Если вам потребуется отключить несколькострок программного кода и запустить сценарий снова, просто вставьте по трикавычки до и после нужного блока кода, как показано ниже:X = 1“””import osprint(os.getcwd())“””Y = 2Строки в действии217Я назвал этот прием ужасным, потому что при работе интерпретатор вынужден создавать строку из строк программного кода, отключенных таким способом, но, скорее всего, это слабо сказывается на производительности. В случаекрупных блоков программного кода использовать этот прием гораздо удобнее,чем вставлять символы решетки в начале каждой строки, а затем убирать их.Это особенно верно, если используемый вами текстовый редактор не поддерживает возможность редактирования исходных текстов на языке Python.