SlideShare a Scribd company logo
1 of 43
Download to read offline
Лекция 4: Строки, байты, файлы и ввод/вывод
Сергей Лебедев
sergei.a.lebedev@gmail.com
28 сентября 2015 г.
Строки
Строковые литералы
• Для объявления строки можно использовать двойные или
одинарные кавычки:
>>> "foobar" == 'foobar'
True
• Зачем так много?
>>> '"Where art thou?"'
'"Where art thou?"'
>>> "I'm here!"
"I'm here!"
• Для многострочных блоков текста используют тройные
кавычки:
>>> """foo
... bar"""
'foonbar'
>>> '''foo
... bar'''
'foonbar'
• Подряд идущие строковые литералы “склеиваются”:
>>> "foo" "bar"
'foobar'
1 / 39
Экранированные последовательности и “сырые” строки
• Строковые литералы могут содержать экранированные
последовательности, например1:
' одинарная кавычка,
" двойная кавычка,
t символ вертикальной табуляции,
n символ переноса строки,
xhh символ с HEX кодом hh.
• В “сырых” строковых литералах экранированные
последовательности не обрабатываются.
>>> print("tell me")
ell me
>>> print(r"tell me")
tell me
1
Полный список поддерживаемых последовательностей можно прочитать
в документации http://bit.ly/escape-sequences
2 / 39
Стандарт ASCII2
2
http://en.wikipedia.org/wiki/ASCII
3 / 39
Стандарт Юникод
• Юникод — стандарт кодирования текста на разных языках.
• В стандарте версии 8.0 содержится более 120 000
символов.
• Фактически Юникод — это отображение, сопоставляющее
символу3 уникальный номер.
• Как закодировать всё это множество символов байтами?
• Unicode Transformation Format, по N бит на каждый символ:
UTF-8, UTF-16, UTF-32.
• Universal Character Set, по N байт на каждый символ: UCS-2,
UCS-4.
• Если кодировка использует более одного байта, то
закодированный текст может также содержать BOM —
маркер последовательности байтов, U+FEFF.
3
Более формально — codepoint.
4 / 39
Юникод в Python 3
• Тип str — неизменяемая последовательность символов
Юникод:
>>> s = "я строка"
>>> list(s)
['я', ' ', 'с', 'т', 'р', 'о', 'к', 'а']
• Отдельного типа для символов в Python нет: каждый
символ строки — тоже строка:
>>> s[0], type(s[0])
('я', <class 'str'>)
>>> list(s[0])
['я']
• Как строки представляются в памяти?
UTF-8 UTF-16 UTF-32 UCS-2 UCS-4
5 / 39
Внутреннее представление строк
• Начиная с версии 3.3 в Python был реализован PEP-3934,
который описывает механизм адаптивного представления
строк.
• Если строка состоит из символов ASCII, то она хранится в
кодировке UCS-1, то есть каждый символ представляется
одним байтом.
• Если максимальный код символа в строке меньше 216
, то
используется UCS-2.
• Иначе используется UCS-4, кодирующая каждый символ
четырьмя байтами.
• Несколько примеров:
>>> list(map(ord, "hello")) # UCS-1
[104, 101, 108, 108, 111]
>>> list(map(ord, "привет")) # UCS-2
[1087, 1088, 1080, 1074, 1077, 1090]
>>> ord("") # UCS-4, почти
127025
4
http://python.org/dev/peps/pep-0393
6 / 39
Ещё немного про Юникод и строки
• Python поддерживает экранированные
последовательности для символов Юникода:
>>> "u0068", "U00000068"
('h', 'h')
>>> "N{DOMINO TILE HORIZONTAL-00-00}"
''
• Получить символ Юникода по его коду можно с помощью
функции chr:
>>> chr(0x68)
'h'
>>> chr(1087)
'п'
• Очевидное наблюдение:
>>> def identity(ch):
... return chr(ord(ch))
...
>>> identity("п")
'п'
7 / 39
Методы работы со строками: модификаторы регистра
>>> "foo bar".capitalize()
'Foo bar'
>>> "foo bar".title()
'Foo Bar'
>>> "foo bar".upper()
'FOO BAR'
>>> "foo bar".lower()
'foo bar'
>>> "foo bar".title().swapcase()
'fOO bAR'
8 / 39
Методы работы со строками: выравнивание
• Группа методов, выравнивающих строку в “блоке”
фиксированной длины. При этом дополнительные позиции
заполняются указанным символом:
>>> "foo bar".ljust(16, '~')
'foo bar~~~~~~~~~'
>>> "foo bar".rjust(16, '~')
'~~~~~~~~~foo bar'
>>> "foo bar".center(16, '~')
'~~~~foo bar~~~~~'
• В качестве символа по умолчанию используется пробел:
>>> "foo bar".ljust(16)
'foo bar '
>>> "foo bar".rjust(16)
' foo bar'
>>> "foo bar".center(16)
' foo bar '
• Если длина “блока” меньше длины строки, то строка
возвращается без изменений.
9 / 39
Методы работы со строками: удаление символов
• Группа методов, заканчивающихся на strip, удаляет все
вхождения указанных символов слева, справа или с обоих
концов строки:
>>> "]>>foo bar<<[".lstrip("]>")
'foo bar<<['
>>> "]>>foo bar<<[".rstrip("[<")
']>>foo bar'
>>> "]>>foo bar<<[".strip("[]<>")
'foo bar'
• По умолчанию удаляются все пробелы:
>>> "t foo bar rn ".strip()
'foo bar'
10 / 39
Методы работы со строками: разделение
• Метод split разделяет строку на подстроки по указанному
разделителю:
>>> "foo,bar".split(",")
['foo', 'bar']
>>> "foo,,,bar".split(",")
['foo', '', '', 'bar']
• Если разделитель не указан, то строка разделяется по
пробелам.
>>> "t foo bar rn ".split()
['foo', 'bar']
• Метод partition возвращает кортеж из трёх элементов:
подстрока до вхождения разделителя, сам разделитель и
подстрока после вхождения разделителя.
>>> "foo,bar,baz".partition(",")
('foo', ',', 'bar,baz')
>>> "foo,bar,baz".rpartition(",")
('foo,bar', ',', 'baz')
11 / 39
Методы работы со строками: соединение
• С помощью метода join можно соединить любую
последовательность строк:
>>> ", ".join(["foo", "bar", "baz"])
'foo, bar, baz'
>>> ", ".join(filter(None, ["", "foo"]))
'foo'
>>> ", ".join("bar")
'b, a, r'
• Если последовательность содержит объекты другого типа,
будет ошибка:
>>> ", ".join(range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance [...]
12 / 39
Методы работы со строками: проверка на вхождение
• Вхождение подстроки идиоматично проверять с помощью
операторов in и not in:
>>> "foo" in "foobar"
True
>>> "yada" not in "foobar"
True
• Также можно сравнивать префикс или суффикс строки с
одной или несколькими строками:
>>> "foobar".startswith("foo")
True
>>> "foobar".endswith(("boo", "bar"))
True
13 / 39
Методы работы со строками: поиск подстроки
• Найти место первого вхождения подстроки можно с
помощью метода find:
>>> "abracadabra".find("ra")
2
>>> "abracadabra".find("ra", 0, 3)
-1
• Метод index аналогичен find, но, если искомая подстрока
не найдена, он поднимает исключение:
>>> "abracadabra".index("ra", 0, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
• Для поиска места последнего вхождения подстроки можно
воспользоваться методами rfind и rindex.
14 / 39
Методы работы со строками: замена подстроки
• Метод replace заменяет вхождения подстроки на
заданную строку, по умолчанию — все:
>>> "abracadabra".replace("ra", "**")
'ab**cadab**'
>>> "abracadabra".replace("ra", "**", 1)
'ab**cadabra'
• Для множественной замены символов удобно
использовать метод translate, который принимает
словарь трансляции.
>>> translation_map = {ord("a"): "*", ord("b"): "?"}
>>> "abracadabra".translate(tranlation_map)
'*?r*c*d*?r*'
15 / 39
Методы работы со строками: предикаты
• Методы-предикаты позволяют проверить строку на
соответствие некоторому формату, например:
>>> "100500".isdigit()
True
>>> "foo100500".isalnum()
True
>>> "foobar".isalpha()
True
• Другие полезные предикаты:
>>> "foobar".islower()
True
>>> "FOOBAR".isupper()
True
>>> "Foo Bar".istitle()
True
>>> "r nt rn".isspace()
True
16 / 39
Форматирование строк: метод format
• В Python есть два способа форматирования строк. Первый,
который мы рассмотрим, использует метод format:
>>> "{}, {}, how are you?".format("Hello", "Sally")
'Hello, Sally, how are you?'
>>> "Today is October, {}th.".format(8)
'Today is October, 8th.'
• {} обозначает место, в которое будет подставлен
позиционный аргумент.
• Внутри {} можно опционально указать способ
преобразования объекта в строку и спецификацию
формата.
17 / 39
Преобразование объекта в строку
• В Python 3 есть три различных по смыслу способа
преобразовать объект в строку:
• str возвращает человекочитаемое представление объекта,
• repr возвращает представление объекта, по которому
можно однозначно восстановить его значение,
• ascii аналогичен repr по смыслу, но возвращаемая строка
состоит только из символов ASCII.
• Примеры:
>>> str("я строка")
'я строка'
>>> repr("я строка")
"'я строка'"
>>> ascii("я строка")
"'u044f u0441u0442u0440u043eu043au0430'"
18 / 39
Форматирование строк: {}
• Напоминание: внутри {} можно опционально указать
способ преобразования объекта в строку и спецификацию
формата.
• Для преобразования объекта в строку используются
первые буквы соответствующих функций:
>>> "{!s}".format("я строка") # str
'я строка'
>>> "{!r}".format("я строка") # repr
"'я строка'"
>>> "{!a}".format("я строка") # ascii
"'u044f u0441u0442u0440u043eu043au0430'"
• Зачем нужна спецификация формата?
19 / 39
Форматирование строк: спецификация формата
• Спецификация формата позволяет:
• выровнять строку в “блоке” фиксированной длины,
>>> "{:~^16}".format("foo bar")
'~~~~foo bar~~~~~'
• привести число к другой системе счисления,
>>> "int: {0:d} hex: {0:x}".format(42)
'int: 42 hex: 2a'
>>> "oct: {0:o} bin: {0:b}".format(42)
'oct: 52 bin: 101010'
• потребовать наличие знака в строковом представлении
числа и зафиксировать количество знаков до или после
запятой.
>>> "{:+08.2f}".format(-42.42)
'-0042.42'
• Комбинированный пример:
>>> "{!r:~^16}".format("foo bar")
"~~~'foo bar'~~~~"
20 / 39
Форматирование строк: позиционные и ключевые аргументы
• Внутри {} можно также явно указывать номер
позиционного или имя ключевого аргумента:
>>> "{0}, {1}, {0}".format("hello", "kitty")
'hello, kitty, hello'
>>> "{0}, {who}, {0}".format("hello", who="kitty")
'hello, kitty, hello'
• Если один из аргументов — контейнер, то при
форматировании можно обращаться к его элементам по
индексу или ключу:
>>> point = 0, 10
>>> "x = {0[0]}, y = {0[1]}".format(point)
'x = 0, y = 10'
>>> point = {"x": 0, "y": 10}
>>> "x = {0[x]}, y = {0[y]}".format(point)
'x = 0, y = 10'
21 / 39
Форматирование строк: олдскул
• Ещё один способ форматирования строк в Python
использует оператор % и внешне похож на printf:
>>> "%s, %s, how are you?" % ("Hello", "Sally")
'Hello, Sally, how are you?'
>>> point = {"x": 0, "y": 10}
>>> "x = %(x)+2d, y = %(y)+2d" % point
'x = +0, y = +10'
• Он менее выразителен и гибок, чем format:
• % — бинарный оператор, справа от него может быть один
аргумент: кортеж или словарь,
• каждый элемент кортежа используется только один раз,
• нет синтаксиса для обращения к элементам контейнера или
атрибутам объекта,
• не предусмотрена возможность расширения, например,
если потребуется форматировать длинные числа с
плавающей точкой, то синтаксис "%8.2f" для них работать
не будет.
22 / 39
Форматирование строк: резюме
• В Python есть два механизма форматирования строк:
• с использованием метода format и
• с помощью оператора %.
• Метод format объективно более лучше, поэтому
рекомендуется использовать его.
• Если у вас остались сомнения, то попробуйте предсказать,
что будет выведено в результате:
>>> "I'm a list with three arguments: %s" % [1, 2, 3]
???
>>> "I'm a tuple with three arguments: %s" % (1, 2, 3)
???
>>> "I'm a string with three characters: %s" % "abc"
???
23 / 39
Модуль string
• В модуле string можно найти полезные при работе со
строками константы:
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.punctuation
'!"#%&'()*+,-./:;<=>?@[]^_`{|}~'
>>> string.whitespace
' tnrx0bx0c'
• Остальное содержимое модуля string выходит за рамки
сегодняшней лекции. Не стесняйтесь обращаться к
документации5, если вам интересно.
5
http://docs.python.org/3/library/string
24 / 39
Строки: резюме
• Строки в Python 3 — это последовательности символов
(правильнее codepoints) Юникод.
• В отличие от C/C++ или Java:
• нет разницы между одинарными и двойными кавычками,
• символ строки — это тоже строка,
• можно использовать тройные кавычки для многострочных
блоков текста.
• Обилие методов у класса str позволяет не изобретать
велосипед при работе с текстовыми данными.
• Для форматирования строк следует использовать метод
format, но полезно знать также про синтаксис с
использованием оператора %.
25 / 39
Байты
Байты
• Тип bytes — неизменяемая последовательность байтов.
• Аналогично строковым литералам в Python есть литералы
для байтов и “сырых” байтов:
>>> b"00422400"
b'x00"x14x00'
>>> rb"00422400"
b'00422400'
• Байты и строки тесно связаны:
• строку можно закодировать последовательностью байтов
>>> chunk = "я строка".encode("utf-8")
>>> chunk
b'xd1x8f xd1x81xd1x82xd1x80xd0[...]'
• и из последовательности байтов можно раскодировать
строку
>>> chunk.decode("utf-8")
'я строка'
• Напоминание: "utf-8" — одна из кодировок Юникода.
26 / 39
Байты, строки и кодировки
• Кодировка специфицирует преобразование текстовой
строки в последовательность байтов. Стандартная
библиотека Python поддерживает более сотни кодировок.
• Любители Windows наверняка узнают магическое
сочетание букв в следующем примере:
>>> chunk = "я строка".encode("cp1251")
>>> chunk
b'xff xf1xf2xf0xeexeaxe0'
• Что будет, если указать неверную кодировку?
>>> chunk.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode [...]
27 / 39
Кодировки и ошибки
• Методы encode и decode принимают опциональный
аргумент, контролирующий логику обработки ошибок:
• "strict" — ошибочные символы поднимают исключение,
• "ignore" — ошибочные символы пропускаются,
• "replace" — ошибочные символы заменяются на
"ufffd".
• Пример:
>>> chunk = "я строка".encode("cp1251")
>>> chunk.decode("utf-8", "ignore")
' '
>>> chunk.decode("utf-8", "replace")
'? ??????' # не совсем так
• Если не указывать кодировку, то Python будет
использовать системную кодировку по умолчанию:
>>> import sys
>>> sys.getdefaultencoding()
'utf-8' # на Linux и OS X
28 / 39
Методы работы с байтами
• Байты поддерживают большинство операций,
специфичных для строк, за исключением:
• метода encode, кодирующего строку в байты,
• метода format, форматирующего строку для вывода,
• некоторых предикатов, о которых мы не говорили.
• Также стоит помнить, что тип bytes соответствутет
последовательности байтов, а не символов, то есть:
>>> "boo" in b"foobar"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Type str doesn't support the buffer API
>>> b"foobar".replace("o", "")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected bytes, bytearray or [...]
29 / 39
Байты: резюме
• Байты в Python 3 — это специальный тип для
последовательности байтов.
• Байты — это не строки, а строки — это не байты, но:
• строку можно кодировать байтами,
• а байты можно декодировать в строку.
• Большинство операций, поддерживаемых строками,
реализованы и для байтов:
>>> b"foo bar".title().center(16, b"~")
b'~~~~Foo Bar~~~~~'
30 / 39
Файлы и
ввод/вывод
Функция open
• Текстовые и бинарные файлы в Python — это две большие
разницы.
• Создать объект типа файл можно с помощью функции open,
которая принимает один обязательный аргумент — путь к
файлу:
>>> open("./HBA1.txt")
<[...] name='./HBA1.txt' mode='r' encoding='UTF-8'>
• Аргументов у функции open довольно много, нас будут
интересовать:
• mode — определяет, в каком режиме будет открыт файл,
возможные значения:
• "r", "w", "x", "a", "+",
• "b", "t".
• для текстовых файлов можно также указать encoding и
errors.
31 / 39
Примеры использования функции open
• Открыть бинарный файл для чтения и записи:
>>> open("./csc.db", "r+b")
<_io.BufferedRandom name='./csc.db'>
• Открыть текстовый в файл в кодировке "cp1251" для
добавления, игнорируя ошибки кодирования:
>>> open("./admin.log", "a", encoding="cp1251",
... errors="ignore")
<[...] name='./admin.log' mode='a' encoding='cp1251'>
• Создать новый текстовый файл в системной кодировке и
открыть его для записи:
>>> open("./lecture4.tex", "x")
<[...] name='./lecture4.tex' mode='x' encoding='UTF-8'>
32 / 39
Методы работы с файлами: чтение6
• Метод read читает не более, чем n символов из файла:
>>> handle = open("./HBA1.txt")
>>> handle.read(16)
'MVLSGEDKSNIKAAWG'
• Методы readline и readlines читают одну или все строчки
соотвественно. Можно указать максимальное количество
символов, которые надо прочитать:
>>> handle = open("./HBA1.txt")
>>> len(handle.readline())
143
>>> handle.readline(16)
'MVLSGEDKSNIKAAWG'
>>> handle.readlines(16)
['KIGGHGAEYGAEALERMFASFPTTKTYFPHFDVSHGSAQVKGHGKKVADA'
'LANAAGHLDDLPGALSALSDLHAHKLRVDPVNFKLLSHCLLVTLASHHPA'
'DFTPAVHASLDKFLASVSTVLTSKYRn'] # n!
6
Все примеры используют текстовый файл. Семантика методов в случае
бинарного файла аналогична.
33 / 39
Методы работы с файлами: запись
• Метод write записывает строку в файл:
>>> handle = open("./example.txt", "w")
>>> handle.write("abracadabra")
11 # количество записанных байт.
Неявного добавления символа окончания строки при этом
не происходит.
• Записать последовательность строк можно с помощью
метода writelines:
>>> handle.writelines(["foo", "bar"])
34 / 39
Методы работы с файлами: другие
>>> handle = open("./example.txt", "r+")
>>> handle.fileno()
3
>>> handle.tell()
0
>>> handle.seek(8)
>>> handle.tell()
8
>>> handle.write("something unimportant")
>>> handle.flush()
>>> handle.close()
35 / 39
Стандартные потоки
• Интерпретатор Python предоставляет три текстовых
файла, называемых стандартными потоками
ввода/вывода: sys.stdin, sys.stdout и sys.stderr.
• Для чтения sys.stdin используют функцию input:
>>> input("Name: ")
Name: Pumpkin
'Pumpkin'
>>> input()
42
'42'
• Для записи в sys.stdout или sys.stderr — функцию print:
>>> print("Hello, `sys.stdout`!", file=sys.stdout)
Hello, `sys.stdout`!
>>> print("Hello, `sys.stderr`!", file=sys.stderr)
Hello, `sys.stderr`!
36 / 39
Пара слов о функции print
• Функция print позволяет изменять разделитель между
аругументами:
>>> print(*range(4))
0 1 2 3
>>> print(*range(4), sep="_")
0_1_2_3
• указывать последовательность, которой заканчивается
вывод:
>>> print(*range(4), end="n--n")
0 1 2 3
--
• и форсировать вызов flush у файла, в который
осуществляется вывод:
>>> handle = open("./example.txt", "w")
>>> print(*range(4), file=handle, flush=True)
37 / 39
Модуль io с высоты птичьего полёта
• В модуле io реализованы базовые классы для работы с
текстовыми и бинарными данными.
• Класс io.StringIO позволяет получить файловый объект
из строки, а io.BytesIO из байтов:
>>> import io
>>> handle = io.StringIO("foonbar")
>>> handle.readline()
'foon'
>>> handle.write("boo")
>>> handle.getvalue()
'foonboo'
• Аналогичный пример для io.BytesIO:
>>> handle = io.BytesIO(b"foobar")
>>> handle.read(3)
b'foo'
>>> handle.getvalue()
b'foobar'
38 / 39
Резюме: файлы и ввод/вывод
• Файлы бывают текстовые и бинарные, их можно читать и в
них можно писать.
• Методы работы с файлами глобально не отличаются от
других языков:
>>> handle = open("./example.txt", "w")
>>> handle.write("foobar")
6
>>> handle.close()
• Стандартные потоки ввода/вывода в Python тоже
представляются в виде текстовых файлов. Для работы с
ними удобно использовать функции input и print.
• В модуле io реализована иерархия низкоуровневых
классов для работы с вводом/выводом. Полезные для
обычных людей классы: io.StringIO и io.BytesIO.
39 / 39

More Related Content

What's hot

Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Roman Brovko
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Roman Brovko
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка DjangoVladimir Rudnyh
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности PythonPyNSK
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?PyNSK
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 

What's hot (20)

Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.Лекция 7. Исключения и менеджеры контекста.
Лекция 7. Исключения и менеджеры контекста.
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Оптимизация производительности Python
Оптимизация производительности PythonОптимизация производительности Python
Оптимизация производительности Python
 
Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?Магия в Python: Дескрипторы. Что это?
Магия в Python: Дескрипторы. Что это?
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 

Viewers also liked

02 - Практика UML. Уровни приложения
02 - Практика UML. Уровни приложения02 - Практика UML. Уровни приложения
02 - Практика UML. Уровни приложенияRoman Brovko
 
12 - Практика UML. Создание wireframe
12 - Практика UML. Создание wireframe12 - Практика UML. Создание wireframe
12 - Практика UML. Создание wireframeRoman Brovko
 
01 - Практика UML. Нужен ли UML?
01 - Практика UML. Нужен ли UML?01 - Практика UML. Нужен ли UML?
01 - Практика UML. Нужен ли UML?Roman Brovko
 
03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты03 - Практика UML. Прецеденты
03 - Практика UML. ПрецедентыRoman Brovko
 
13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработкеRoman Brovko
 
09 - Практика UML. Use Case диаграммы
09 - Практика UML. Use Case диаграммы09 - Практика UML. Use Case диаграммы
09 - Практика UML. Use Case диаграммыRoman Brovko
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентовRoman Brovko
 

Viewers also liked (7)

02 - Практика UML. Уровни приложения
02 - Практика UML. Уровни приложения02 - Практика UML. Уровни приложения
02 - Практика UML. Уровни приложения
 
12 - Практика UML. Создание wireframe
12 - Практика UML. Создание wireframe12 - Практика UML. Создание wireframe
12 - Практика UML. Создание wireframe
 
01 - Практика UML. Нужен ли UML?
01 - Практика UML. Нужен ли UML?01 - Практика UML. Нужен ли UML?
01 - Практика UML. Нужен ли UML?
 
03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты03 - Практика UML. Прецеденты
03 - Практика UML. Прецеденты
 
13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке13 - Практика UML. Переход к разработке
13 - Практика UML. Переход к разработке
 
09 - Практика UML. Use Case диаграммы
09 - Практика UML. Use Case диаграммы09 - Практика UML. Use Case диаграммы
09 - Практика UML. Use Case диаграммы
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 

Similar to Лекция 4. Строки, байты, файлы и ввод/вывод.

Дополнительные возможности Javascript
Дополнительные возможности JavascriptДополнительные возможности Javascript
Дополнительные возможности JavascriptDenis Latushkin
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksRoman Dvornov
 
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаPositive Hack Days
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket scienceOlga Kiseleva
 
презентация лекции №8
презентация лекции №8презентация лекции №8
презентация лекции №8student_kai
 
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"Ciklum Ukraine
 
массивы.строки
массивы.строкимассивы.строки
массивы.строкиdasha2012
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Лекция 9. Основы HTML. Часть 2.
Лекция 9. Основы HTML. Часть 2.Лекция 9. Основы HTML. Часть 2.
Лекция 9. Основы HTML. Часть 2.Alexey Furmanov
 
Classes: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilderClasses: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilderAlexey Bovanenko
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
 
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...Ontico
 
Join the python_side
Join the python_sideJoin the python_side
Join the python_sidePaul Dmitryev
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 

Similar to Лекция 4. Строки, байты, файлы и ввод/вывод. (20)

Дополнительные возможности Javascript
Дополнительные возможности JavascriptДополнительные возможности Javascript
Дополнительные возможности Javascript
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Hf labs education day. rocket science
Hf labs education day. rocket scienceHf labs education day. rocket science
Hf labs education day. rocket science
 
презентация лекции №8
презентация лекции №8презентация лекции №8
презентация лекции №8
 
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
CiklumCPPSat: Ivan Romanenko "Experience of work with Boost Spirit"
 
массивы.строки
массивы.строкимассивы.строки
массивы.строки
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Лекция 9. Основы HTML. Часть 2.
Лекция 9. Основы HTML. Часть 2.Лекция 9. Основы HTML. Часть 2.
Лекция 9. Основы HTML. Часть 2.
 
PascalABC.NET 2015-2016
PascalABC.NET 2015-2016PascalABC.NET 2015-2016
PascalABC.NET 2015-2016
 
Classes: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilderClasses: Number, String, StringBuffer, StringBuilder
Classes: Number, String, StringBuffer, StringBuilder
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
Microsoft Ajax Minifier – автоматическая опитимизация JavaScript и CSS для ве...
 
Join the python_side
Join the python_sideJoin the python_side
Join the python_side
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task NetworkingRoman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernetRoman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flashRoman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2CRoman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uartRoman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorRoman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwmRoman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsRoman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_worldRoman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisitesRoman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advancedRoman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advancedRoman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окруженияRoman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advancedRoman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basicsRoman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

Лекция 4. Строки, байты, файлы и ввод/вывод.

  • 1. Лекция 4: Строки, байты, файлы и ввод/вывод Сергей Лебедев sergei.a.lebedev@gmail.com 28 сентября 2015 г.
  • 3. Строковые литералы • Для объявления строки можно использовать двойные или одинарные кавычки: >>> "foobar" == 'foobar' True • Зачем так много? >>> '"Where art thou?"' '"Where art thou?"' >>> "I'm here!" "I'm here!" • Для многострочных блоков текста используют тройные кавычки: >>> """foo ... bar""" 'foonbar' >>> '''foo ... bar''' 'foonbar' • Подряд идущие строковые литералы “склеиваются”: >>> "foo" "bar" 'foobar' 1 / 39
  • 4. Экранированные последовательности и “сырые” строки • Строковые литералы могут содержать экранированные последовательности, например1: ' одинарная кавычка, " двойная кавычка, t символ вертикальной табуляции, n символ переноса строки, xhh символ с HEX кодом hh. • В “сырых” строковых литералах экранированные последовательности не обрабатываются. >>> print("tell me") ell me >>> print(r"tell me") tell me 1 Полный список поддерживаемых последовательностей можно прочитать в документации http://bit.ly/escape-sequences 2 / 39
  • 6. Стандарт Юникод • Юникод — стандарт кодирования текста на разных языках. • В стандарте версии 8.0 содержится более 120 000 символов. • Фактически Юникод — это отображение, сопоставляющее символу3 уникальный номер. • Как закодировать всё это множество символов байтами? • Unicode Transformation Format, по N бит на каждый символ: UTF-8, UTF-16, UTF-32. • Universal Character Set, по N байт на каждый символ: UCS-2, UCS-4. • Если кодировка использует более одного байта, то закодированный текст может также содержать BOM — маркер последовательности байтов, U+FEFF. 3 Более формально — codepoint. 4 / 39
  • 7. Юникод в Python 3 • Тип str — неизменяемая последовательность символов Юникод: >>> s = "я строка" >>> list(s) ['я', ' ', 'с', 'т', 'р', 'о', 'к', 'а'] • Отдельного типа для символов в Python нет: каждый символ строки — тоже строка: >>> s[0], type(s[0]) ('я', <class 'str'>) >>> list(s[0]) ['я'] • Как строки представляются в памяти? UTF-8 UTF-16 UTF-32 UCS-2 UCS-4 5 / 39
  • 8. Внутреннее представление строк • Начиная с версии 3.3 в Python был реализован PEP-3934, который описывает механизм адаптивного представления строк. • Если строка состоит из символов ASCII, то она хранится в кодировке UCS-1, то есть каждый символ представляется одним байтом. • Если максимальный код символа в строке меньше 216 , то используется UCS-2. • Иначе используется UCS-4, кодирующая каждый символ четырьмя байтами. • Несколько примеров: >>> list(map(ord, "hello")) # UCS-1 [104, 101, 108, 108, 111] >>> list(map(ord, "привет")) # UCS-2 [1087, 1088, 1080, 1074, 1077, 1090] >>> ord("") # UCS-4, почти 127025 4 http://python.org/dev/peps/pep-0393 6 / 39
  • 9. Ещё немного про Юникод и строки • Python поддерживает экранированные последовательности для символов Юникода: >>> "u0068", "U00000068" ('h', 'h') >>> "N{DOMINO TILE HORIZONTAL-00-00}" '' • Получить символ Юникода по его коду можно с помощью функции chr: >>> chr(0x68) 'h' >>> chr(1087) 'п' • Очевидное наблюдение: >>> def identity(ch): ... return chr(ord(ch)) ... >>> identity("п") 'п' 7 / 39
  • 10. Методы работы со строками: модификаторы регистра >>> "foo bar".capitalize() 'Foo bar' >>> "foo bar".title() 'Foo Bar' >>> "foo bar".upper() 'FOO BAR' >>> "foo bar".lower() 'foo bar' >>> "foo bar".title().swapcase() 'fOO bAR' 8 / 39
  • 11. Методы работы со строками: выравнивание • Группа методов, выравнивающих строку в “блоке” фиксированной длины. При этом дополнительные позиции заполняются указанным символом: >>> "foo bar".ljust(16, '~') 'foo bar~~~~~~~~~' >>> "foo bar".rjust(16, '~') '~~~~~~~~~foo bar' >>> "foo bar".center(16, '~') '~~~~foo bar~~~~~' • В качестве символа по умолчанию используется пробел: >>> "foo bar".ljust(16) 'foo bar ' >>> "foo bar".rjust(16) ' foo bar' >>> "foo bar".center(16) ' foo bar ' • Если длина “блока” меньше длины строки, то строка возвращается без изменений. 9 / 39
  • 12. Методы работы со строками: удаление символов • Группа методов, заканчивающихся на strip, удаляет все вхождения указанных символов слева, справа или с обоих концов строки: >>> "]>>foo bar<<[".lstrip("]>") 'foo bar<<[' >>> "]>>foo bar<<[".rstrip("[<") ']>>foo bar' >>> "]>>foo bar<<[".strip("[]<>") 'foo bar' • По умолчанию удаляются все пробелы: >>> "t foo bar rn ".strip() 'foo bar' 10 / 39
  • 13. Методы работы со строками: разделение • Метод split разделяет строку на подстроки по указанному разделителю: >>> "foo,bar".split(",") ['foo', 'bar'] >>> "foo,,,bar".split(",") ['foo', '', '', 'bar'] • Если разделитель не указан, то строка разделяется по пробелам. >>> "t foo bar rn ".split() ['foo', 'bar'] • Метод partition возвращает кортеж из трёх элементов: подстрока до вхождения разделителя, сам разделитель и подстрока после вхождения разделителя. >>> "foo,bar,baz".partition(",") ('foo', ',', 'bar,baz') >>> "foo,bar,baz".rpartition(",") ('foo,bar', ',', 'baz') 11 / 39
  • 14. Методы работы со строками: соединение • С помощью метода join можно соединить любую последовательность строк: >>> ", ".join(["foo", "bar", "baz"]) 'foo, bar, baz' >>> ", ".join(filter(None, ["", "foo"])) 'foo' >>> ", ".join("bar") 'b, a, r' • Если последовательность содержит объекты другого типа, будет ошибка: >>> ", ".join(range(10)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 0: expected str instance [...] 12 / 39
  • 15. Методы работы со строками: проверка на вхождение • Вхождение подстроки идиоматично проверять с помощью операторов in и not in: >>> "foo" in "foobar" True >>> "yada" not in "foobar" True • Также можно сравнивать префикс или суффикс строки с одной или несколькими строками: >>> "foobar".startswith("foo") True >>> "foobar".endswith(("boo", "bar")) True 13 / 39
  • 16. Методы работы со строками: поиск подстроки • Найти место первого вхождения подстроки можно с помощью метода find: >>> "abracadabra".find("ra") 2 >>> "abracadabra".find("ra", 0, 3) -1 • Метод index аналогичен find, но, если искомая подстрока не найдена, он поднимает исключение: >>> "abracadabra".index("ra", 0, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found • Для поиска места последнего вхождения подстроки можно воспользоваться методами rfind и rindex. 14 / 39
  • 17. Методы работы со строками: замена подстроки • Метод replace заменяет вхождения подстроки на заданную строку, по умолчанию — все: >>> "abracadabra".replace("ra", "**") 'ab**cadab**' >>> "abracadabra".replace("ra", "**", 1) 'ab**cadabra' • Для множественной замены символов удобно использовать метод translate, который принимает словарь трансляции. >>> translation_map = {ord("a"): "*", ord("b"): "?"} >>> "abracadabra".translate(tranlation_map) '*?r*c*d*?r*' 15 / 39
  • 18. Методы работы со строками: предикаты • Методы-предикаты позволяют проверить строку на соответствие некоторому формату, например: >>> "100500".isdigit() True >>> "foo100500".isalnum() True >>> "foobar".isalpha() True • Другие полезные предикаты: >>> "foobar".islower() True >>> "FOOBAR".isupper() True >>> "Foo Bar".istitle() True >>> "r nt rn".isspace() True 16 / 39
  • 19. Форматирование строк: метод format • В Python есть два способа форматирования строк. Первый, который мы рассмотрим, использует метод format: >>> "{}, {}, how are you?".format("Hello", "Sally") 'Hello, Sally, how are you?' >>> "Today is October, {}th.".format(8) 'Today is October, 8th.' • {} обозначает место, в которое будет подставлен позиционный аргумент. • Внутри {} можно опционально указать способ преобразования объекта в строку и спецификацию формата. 17 / 39
  • 20. Преобразование объекта в строку • В Python 3 есть три различных по смыслу способа преобразовать объект в строку: • str возвращает человекочитаемое представление объекта, • repr возвращает представление объекта, по которому можно однозначно восстановить его значение, • ascii аналогичен repr по смыслу, но возвращаемая строка состоит только из символов ASCII. • Примеры: >>> str("я строка") 'я строка' >>> repr("я строка") "'я строка'" >>> ascii("я строка") "'u044f u0441u0442u0440u043eu043au0430'" 18 / 39
  • 21. Форматирование строк: {} • Напоминание: внутри {} можно опционально указать способ преобразования объекта в строку и спецификацию формата. • Для преобразования объекта в строку используются первые буквы соответствующих функций: >>> "{!s}".format("я строка") # str 'я строка' >>> "{!r}".format("я строка") # repr "'я строка'" >>> "{!a}".format("я строка") # ascii "'u044f u0441u0442u0440u043eu043au0430'" • Зачем нужна спецификация формата? 19 / 39
  • 22. Форматирование строк: спецификация формата • Спецификация формата позволяет: • выровнять строку в “блоке” фиксированной длины, >>> "{:~^16}".format("foo bar") '~~~~foo bar~~~~~' • привести число к другой системе счисления, >>> "int: {0:d} hex: {0:x}".format(42) 'int: 42 hex: 2a' >>> "oct: {0:o} bin: {0:b}".format(42) 'oct: 52 bin: 101010' • потребовать наличие знака в строковом представлении числа и зафиксировать количество знаков до или после запятой. >>> "{:+08.2f}".format(-42.42) '-0042.42' • Комбинированный пример: >>> "{!r:~^16}".format("foo bar") "~~~'foo bar'~~~~" 20 / 39
  • 23. Форматирование строк: позиционные и ключевые аргументы • Внутри {} можно также явно указывать номер позиционного или имя ключевого аргумента: >>> "{0}, {1}, {0}".format("hello", "kitty") 'hello, kitty, hello' >>> "{0}, {who}, {0}".format("hello", who="kitty") 'hello, kitty, hello' • Если один из аргументов — контейнер, то при форматировании можно обращаться к его элементам по индексу или ключу: >>> point = 0, 10 >>> "x = {0[0]}, y = {0[1]}".format(point) 'x = 0, y = 10' >>> point = {"x": 0, "y": 10} >>> "x = {0[x]}, y = {0[y]}".format(point) 'x = 0, y = 10' 21 / 39
  • 24. Форматирование строк: олдскул • Ещё один способ форматирования строк в Python использует оператор % и внешне похож на printf: >>> "%s, %s, how are you?" % ("Hello", "Sally") 'Hello, Sally, how are you?' >>> point = {"x": 0, "y": 10} >>> "x = %(x)+2d, y = %(y)+2d" % point 'x = +0, y = +10' • Он менее выразителен и гибок, чем format: • % — бинарный оператор, справа от него может быть один аргумент: кортеж или словарь, • каждый элемент кортежа используется только один раз, • нет синтаксиса для обращения к элементам контейнера или атрибутам объекта, • не предусмотрена возможность расширения, например, если потребуется форматировать длинные числа с плавающей точкой, то синтаксис "%8.2f" для них работать не будет. 22 / 39
  • 25. Форматирование строк: резюме • В Python есть два механизма форматирования строк: • с использованием метода format и • с помощью оператора %. • Метод format объективно более лучше, поэтому рекомендуется использовать его. • Если у вас остались сомнения, то попробуйте предсказать, что будет выведено в результате: >>> "I'm a list with three arguments: %s" % [1, 2, 3] ??? >>> "I'm a tuple with three arguments: %s" % (1, 2, 3) ??? >>> "I'm a string with three characters: %s" % "abc" ??? 23 / 39
  • 26. Модуль string • В модуле string можно найти полезные при работе со строками константы: >>> string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >>> string.digits '0123456789' >>> string.punctuation '!"#%&'()*+,-./:;<=>?@[]^_`{|}~' >>> string.whitespace ' tnrx0bx0c' • Остальное содержимое модуля string выходит за рамки сегодняшней лекции. Не стесняйтесь обращаться к документации5, если вам интересно. 5 http://docs.python.org/3/library/string 24 / 39
  • 27. Строки: резюме • Строки в Python 3 — это последовательности символов (правильнее codepoints) Юникод. • В отличие от C/C++ или Java: • нет разницы между одинарными и двойными кавычками, • символ строки — это тоже строка, • можно использовать тройные кавычки для многострочных блоков текста. • Обилие методов у класса str позволяет не изобретать велосипед при работе с текстовыми данными. • Для форматирования строк следует использовать метод format, но полезно знать также про синтаксис с использованием оператора %. 25 / 39
  • 29. Байты • Тип bytes — неизменяемая последовательность байтов. • Аналогично строковым литералам в Python есть литералы для байтов и “сырых” байтов: >>> b"00422400" b'x00"x14x00' >>> rb"00422400" b'00422400' • Байты и строки тесно связаны: • строку можно закодировать последовательностью байтов >>> chunk = "я строка".encode("utf-8") >>> chunk b'xd1x8f xd1x81xd1x82xd1x80xd0[...]' • и из последовательности байтов можно раскодировать строку >>> chunk.decode("utf-8") 'я строка' • Напоминание: "utf-8" — одна из кодировок Юникода. 26 / 39
  • 30. Байты, строки и кодировки • Кодировка специфицирует преобразование текстовой строки в последовательность байтов. Стандартная библиотека Python поддерживает более сотни кодировок. • Любители Windows наверняка узнают магическое сочетание букв в следующем примере: >>> chunk = "я строка".encode("cp1251") >>> chunk b'xff xf1xf2xf0xeexeaxe0' • Что будет, если указать неверную кодировку? >>> chunk.decode("utf-8") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'utf-8' codec can't decode [...] 27 / 39
  • 31. Кодировки и ошибки • Методы encode и decode принимают опциональный аргумент, контролирующий логику обработки ошибок: • "strict" — ошибочные символы поднимают исключение, • "ignore" — ошибочные символы пропускаются, • "replace" — ошибочные символы заменяются на "ufffd". • Пример: >>> chunk = "я строка".encode("cp1251") >>> chunk.decode("utf-8", "ignore") ' ' >>> chunk.decode("utf-8", "replace") '? ??????' # не совсем так • Если не указывать кодировку, то Python будет использовать системную кодировку по умолчанию: >>> import sys >>> sys.getdefaultencoding() 'utf-8' # на Linux и OS X 28 / 39
  • 32. Методы работы с байтами • Байты поддерживают большинство операций, специфичных для строк, за исключением: • метода encode, кодирующего строку в байты, • метода format, форматирующего строку для вывода, • некоторых предикатов, о которых мы не говорили. • Также стоит помнить, что тип bytes соответствутет последовательности байтов, а не символов, то есть: >>> "boo" in b"foobar" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Type str doesn't support the buffer API >>> b"foobar".replace("o", "") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: expected bytes, bytearray or [...] 29 / 39
  • 33. Байты: резюме • Байты в Python 3 — это специальный тип для последовательности байтов. • Байты — это не строки, а строки — это не байты, но: • строку можно кодировать байтами, • а байты можно декодировать в строку. • Большинство операций, поддерживаемых строками, реализованы и для байтов: >>> b"foo bar".title().center(16, b"~") b'~~~~Foo Bar~~~~~' 30 / 39
  • 35. Функция open • Текстовые и бинарные файлы в Python — это две большие разницы. • Создать объект типа файл можно с помощью функции open, которая принимает один обязательный аргумент — путь к файлу: >>> open("./HBA1.txt") <[...] name='./HBA1.txt' mode='r' encoding='UTF-8'> • Аргументов у функции open довольно много, нас будут интересовать: • mode — определяет, в каком режиме будет открыт файл, возможные значения: • "r", "w", "x", "a", "+", • "b", "t". • для текстовых файлов можно также указать encoding и errors. 31 / 39
  • 36. Примеры использования функции open • Открыть бинарный файл для чтения и записи: >>> open("./csc.db", "r+b") <_io.BufferedRandom name='./csc.db'> • Открыть текстовый в файл в кодировке "cp1251" для добавления, игнорируя ошибки кодирования: >>> open("./admin.log", "a", encoding="cp1251", ... errors="ignore") <[...] name='./admin.log' mode='a' encoding='cp1251'> • Создать новый текстовый файл в системной кодировке и открыть его для записи: >>> open("./lecture4.tex", "x") <[...] name='./lecture4.tex' mode='x' encoding='UTF-8'> 32 / 39
  • 37. Методы работы с файлами: чтение6 • Метод read читает не более, чем n символов из файла: >>> handle = open("./HBA1.txt") >>> handle.read(16) 'MVLSGEDKSNIKAAWG' • Методы readline и readlines читают одну или все строчки соотвественно. Можно указать максимальное количество символов, которые надо прочитать: >>> handle = open("./HBA1.txt") >>> len(handle.readline()) 143 >>> handle.readline(16) 'MVLSGEDKSNIKAAWG' >>> handle.readlines(16) ['KIGGHGAEYGAEALERMFASFPTTKTYFPHFDVSHGSAQVKGHGKKVADA' 'LANAAGHLDDLPGALSALSDLHAHKLRVDPVNFKLLSHCLLVTLASHHPA' 'DFTPAVHASLDKFLASVSTVLTSKYRn'] # n! 6 Все примеры используют текстовый файл. Семантика методов в случае бинарного файла аналогична. 33 / 39
  • 38. Методы работы с файлами: запись • Метод write записывает строку в файл: >>> handle = open("./example.txt", "w") >>> handle.write("abracadabra") 11 # количество записанных байт. Неявного добавления символа окончания строки при этом не происходит. • Записать последовательность строк можно с помощью метода writelines: >>> handle.writelines(["foo", "bar"]) 34 / 39
  • 39. Методы работы с файлами: другие >>> handle = open("./example.txt", "r+") >>> handle.fileno() 3 >>> handle.tell() 0 >>> handle.seek(8) >>> handle.tell() 8 >>> handle.write("something unimportant") >>> handle.flush() >>> handle.close() 35 / 39
  • 40. Стандартные потоки • Интерпретатор Python предоставляет три текстовых файла, называемых стандартными потоками ввода/вывода: sys.stdin, sys.stdout и sys.stderr. • Для чтения sys.stdin используют функцию input: >>> input("Name: ") Name: Pumpkin 'Pumpkin' >>> input() 42 '42' • Для записи в sys.stdout или sys.stderr — функцию print: >>> print("Hello, `sys.stdout`!", file=sys.stdout) Hello, `sys.stdout`! >>> print("Hello, `sys.stderr`!", file=sys.stderr) Hello, `sys.stderr`! 36 / 39
  • 41. Пара слов о функции print • Функция print позволяет изменять разделитель между аругументами: >>> print(*range(4)) 0 1 2 3 >>> print(*range(4), sep="_") 0_1_2_3 • указывать последовательность, которой заканчивается вывод: >>> print(*range(4), end="n--n") 0 1 2 3 -- • и форсировать вызов flush у файла, в который осуществляется вывод: >>> handle = open("./example.txt", "w") >>> print(*range(4), file=handle, flush=True) 37 / 39
  • 42. Модуль io с высоты птичьего полёта • В модуле io реализованы базовые классы для работы с текстовыми и бинарными данными. • Класс io.StringIO позволяет получить файловый объект из строки, а io.BytesIO из байтов: >>> import io >>> handle = io.StringIO("foonbar") >>> handle.readline() 'foon' >>> handle.write("boo") >>> handle.getvalue() 'foonboo' • Аналогичный пример для io.BytesIO: >>> handle = io.BytesIO(b"foobar") >>> handle.read(3) b'foo' >>> handle.getvalue() b'foobar' 38 / 39
  • 43. Резюме: файлы и ввод/вывод • Файлы бывают текстовые и бинарные, их можно читать и в них можно писать. • Методы работы с файлами глобально не отличаются от других языков: >>> handle = open("./example.txt", "w") >>> handle.write("foobar") 6 >>> handle.close() • Стандартные потоки ввода/вывода в Python тоже представляются в виде текстовых файлов. Для работы с ними удобно использовать функции input и print. • В модуле io реализована иерархия низкоуровневых классов для работы с вводом/выводом. Полезные для обычных людей классы: io.StringIO и io.BytesIO. 39 / 39