str Python
Introduction
Объект типа str содержит в себе поседовательность Unicode символов (Unicode code points)
Это Immutable объект. То есть после создания уже нельзя в нём что-то изменить.
Пример
>>> 'HeiHei.ru'
>>> "TopBicycle.ru"
Можно использовть как одинарные так и двойные кавычки. Если начали с одинарной то и закончить нужно одинарной - нельзя смешивать
>>> "eth1.ru'
File "<stdin>", line 1 "eth1.ru' ^ SyntaxError: EOL while scanning string literal
>>> 'eth1.ru"
File "<stdin>", line 1 'eth1.ru" ^ SyntaxError: EOL while scanning string literal
Один тип кавычек можно вложить в другой
>>> "Andrei's site eth1.ru"
"Andrei's site eth1.ru"
Multiline Strings
Многострочные переменные часто удобны для лучшей читаемости кода. Если вы вводите какое-то длинное значени
Их можно создать, заключив значение между """ и """ (или между ''' и ''')
Смотрите также
docsting
>>> """Это пример ...многострочной ...переменной типа ..str"""
'Это пример\nмногострочной\nпеременной типа\nstr'
Каждый перенос строки представлен символом \n. Я выделил его жёлтым для наглядности. Для Python это такой же символ как и остальные просто созданный с помощью экранирования , о котором мы поговорим чуть ниже.
Зададим переменной s значение с использованием \n
>>> s = 'Это пример\nмногострочной\nпеременной типа\nstr' >>> print(s)
Это пример многострочной переменной типа str
Точно такой же результат можно получить используя """ """
>>> s = """Это пример ... многострочной ... переменной типа ... str""" >>> print(s)
Это пример многострочной переменной типа str
Универсальный перенос строки
С помощью встроенного в Python Universal Newlines \n переводится в ту последовательность символов, которая принята в вашей операционной системе.
В
Windows
переход на новую строку (Carriage-return) это \r\n
В
Linux,
MacOS и других
UNIX
это \r
Работая с Python не нужно задумываться выборе символов для переноса строки - достаточно везде писать
\n.
Подробности можно изучить в
PEP 278 -- Universal Newline Support
\ означает начало экранированной последовательности (Escape Sequence).
Также рекомендую к прочтению статью
«Перенос слишком длинной строки на новую»
Escape Sequences
Экранированный символ теряет своё изначальное значение
и воспринимается интерпретатором как обычный символ либо наоборот приобретает дополнительный смысл как мы уже видели на
примере \n
Сравните
>>> "This is n it is a normal symbol"
'This is n it is a normal symbol'
>>> s = "This is n it is a normal symbol"
>>> print(s)
This is n it is a normal symbol
И
>>> "This is \n it is an escaped symbol"
'This is \n it is an escaped symbol'
>>> s = "This is \n it is an escaped symbol"
>>> print(s)
This is it is an escaped symbol
Вместо n теперь перенос строки
Экранирование можно применить для использования одинаковых кавычек внутри и снаружи строки
>>> "Двойная кавычка \" внутри двойных"
'Двойная кавычка " внутри двойных'
>>> 'Одинарная кавычка \' внутри одинарных'
'Одинарная кавычка ' внутри одинарных'
Если экранирование не подразумевается, то \ будет всё равно будет воспринят интерпретатором как попытка экранирования и не появится как обычный символ
>>> 'Двойную кавычку \" можно не экранировать внутри одинарных а \' одинарную нужно'
'Двойную кавычку " можно не экранировать внутри одинарных а \' одинарную нужно'
>>> s = 'Двойную кавычку \" можно не экранировать внутри одинарных а \' одинарную нужно'
>>> print(s)
Двойную кавычку " можно не экранировать внутри одинарных а ' одинарную нужно
To всё-таки увидеть \ нужно написать \\ то есть проэкранировать символ экранирования
>>> s = '\\'
>>> print(s)
\
Escape Sequence | Значение | Примечания |
---|---|---|
\newline | Backslash and newline ignored | |
\\ | Backslash (\) | |
\' | Single quote (') | |
\" | Double quote (") | |
\a | ASCII Bell (BEL) | |
\b | ASCII Backspace (BS) | |
\f | ASCII Formfeed (FF) | |
\n | ASCII Linefeed (LF) | |
\r | ASCII Carriage Return (CR) | |
\t | ASCII Horizontal Tab (TAB) | |
\v | ASCII Vertical Tab (VT) | |
\ooo | Character with octal value ooo | (1,3) |
\xhh | Character with hex value hh | (2,3) |
Escape Sequence | Значение | Примечания |
---|---|---|
\N{name} | Character named name in the Unicode database | (4) |
\uxxxx | Character with 16-bit hex value xxxx | (5) |
\Uxxxxxxxx | Character with 32-bit hex value xxxxxxxx | (6) |
docs.python.org/3/reference/lexical_analysis.html |
Примечания:
As in Standard C, up to three octal digits are accepted.
Unlike in Standard C, exactly two hex digits are required.
In a bytes literal, hexadecimal and octal escapes denote the byte with the given value. In a string literal, these escapes denote a Unicode character with the given value.
Changed in version 3.3: Support for name aliases 1 has been added.
Exactly four hex digits are required.
Any Unicode character can be encoded this way. Exactly eight hex digits are required.
Raw Strings
В случаях когда нужно использовать много символов нуждающихся в экранировании пригодятся raw strings
Они позволяют вводить данные практически в
WYSIWYG
виде.
Например, удобно использовать raw string для храния адреса системного пути в
Windows
>>> path = r'C:\Users\Andrei\Sites\HeiHeiRu'
>>> path
'C:\\Users\\Andrei\\Sites\\HeiHeiRu'
>>> print(path)
C:\Users\Andrei\Sites\HeiHeiRu
Изменить тип на str
С помощью функции str() можно изменить тип объекта на строку. Обычо это используется с числами
>>> str(123)
'123'
>>> str(6.626e-34)
'6.626e-34'
Доступ к символам строки
Если нужно воспользоваться не всем объектом типа str а только каким-то символом, это лего сделать указав его порядковый номер в квадратных скобках.
>>> s = "heihei.ru"
>>> s[0]
'h'
>>> s[1]
'e'
Какой индекс нужно указать, чтоб получить точку?
Проверить тип переменной можно с помощью функции type()
>>> type(s)
<class 'str' >
У символа входящего в состав строки тип, естественно, тоже str
>>> type(s[2])
<class 'str' >
Методы (capitalize)
Изучить все доступные для работы со str методы можно вызвав функцию help с аргументом str
>>> help(str)
Рассмотрим метод capitalize
| capitalize(self, /) | Return a capitalized version of the string. | | More specifically, make the first character have upper case and the rest lower | case.
>>> c = "topBicycle.ru"
>>> c.capitalize()
'Topbicycle.ru'
Первая буква стала заглавной. Все остальные стали строчными.
capitalize() не изменят изначальную строку. Это можно проверить выполнив
>>> c
'topBicycle.ru'
Обрезать строку
# отрезать x символов с конца строки s
s[:-x]
# отрезать y символов с начала строки s
s[y:]
# обрезать и начало и конец
s[y:-x]
Пример
>>> url = "https://www.heihei.ru"
>>> a = url[:-3]
>>> a
>>> 'https://www.heihei'
>>> b = a[12:]
>>> b
>>> 'heihei'
>>> c = url[12:-3]
>>> c
>>> 'heihei'
Unicode
Python поддерживает Unicode так как по дефолту в нём используется UTF-8
Это позволяет использовать юникод символы без заморочек
>>> "Pythonia voi käyttää myös vaativassa ja tieteellisessä"
'Pythonia voi käyttää myös vaativassa ja tieteellisessä'
Если бы поддержки не было скорее всего пришлось бы заменять специальные символы, такие как умлауты, на из юникод представление
>>> "Pythonia voi k\u00e4ytt\u00e4\u00e4 my\u00f6s vaativassa ja tieteellisess\u00e4"
'Pythonia voi käyttää myös vaativassa ja tieteellisessä'
Можно получить юникод символы и другими способами
'\xe4'
'ä'
string Module
Подключив библиотеку strig можно пользоваться готовыми наборами символов
whitespace = ' \t\n\r\v\f'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_letters = ascii_lowercase + ascii_uppercase
digits = '0123456789'
hexdigits = digits + 'abcdef' + 'ABCDEF'
octdigits = '01234567'
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
printable = digits + ascii_letters + punctuation + whitespace
bytes
>>> s = 'abc'
>>> bytes(s, 'utf-8')
b'abc'
>>> s = 'абв'
>>> bytes(s, 'utf-8')
b'\xd0\xb0\xd0\xb1\xd0\xb2'
а - \xd0\xb0
б - \xd0\xb1
в - \xd0\xb2
>>> s = 'ä'
>>> bytes(s, 'utf-8')
b'\xc3\xa4'
ä - \xc3\xa4
>>> s = 'абв'
>>> b = bytes(s, 'utf-8')
print(b)
b'\xd0\xb0\xd0\xb1\xd0\xb2'
>>> str(b)
Получится не совсем то, что нужно
"b'\xd0\xb0\xd0\xb1\xd0\xb2'"
А вот если добавить правильную кодировку, то абв снова появятся
>>> str(b, 'utf-8')
'абв'
Указав неправильную кодировку можно получить какой-то неправильный результат
>>> str(b, 'cp1251')
'абв'
Указав опцию b можно посмотреть содержимое файла, например изображения
>>> file = "/home/andrei/image.png"
>>> f = open(file, 'rb')
>>> f.read()
b'\x89PNG\r\n…
Подробнее в статье «Работа с файлами в Python»