Строки Python 2: байтовые и Unicode строки, кодировки
Строки в Python 2: типы, операции, кодирование
В Python 2 строки делятся на два типа: str (байтовые строки) и unicode (юникодные строки). Первый тип хранит последовательности байтов, второй – символы Юникода. Понимание различий и правильная обработка кодировок – ключ к стабильной работе с текстом.
Как создавать и использовать юникодные строки?
Самое надёжное решение – явно указывать тип строки с помощью префикса u:
unicode_str = u'Тестовая строка с кириллицей'Python strip (метод strip в python)
Если исходные данные приходят в виде байтовой строки, для преобразования применяется метод .decode() с указанием кодировки:
byte_str = 'Русский текст'
unicode_str = byte_str.decode('utf-8')Python повторить строку (повторение строки в python)
Типичная ошибка: попытка сложить str и unicode без явного преобразования.
'hello' + u' мир' # Ошибка: UnicodeDecodeError
Tuple в str python (преобразование кортежа в строку в python)
Решение: привести обе строки к одному типу, например, через .decode() или .encode().
'hello'.decode('ascii') + u' мир' # нормальноPython объект в строку (преобразование объекта в строку в python)
Цель: обеспечить корректную обработку текста любого языка, избежать искажения символов.
Как избежать экранирования специальных символов?
Используйте raw-строки с префиксом r. Они полезны для путей Windows и регулярных выражений:
path = r'C:\Users\Name\Documents'Python convert string (преобразование строк в python)
Без префикса обратная косая черта интерпретируется как управляющий символ.
Проблема: забытый префикс r может привести к неверной интерпретации, например '\n' станет переводом строки.
Решение: всегда проверять наличие префикса при работе с путями или шаблонами.
Цель: упростить запись строк, содержащих обратную косую черту.
Как выполнить форматирование строк в Python 2?
Доступны два основных метода: оператор % и метод .format(). Первый более стар, второй – гибче.
name = 'Иван'
age = 30
# Оператор %
text = 'Меня зовут %s, мне %d лет.' % (name, age)
# Метод format
text2 = 'Меня зовут {0}, мне {1} лет.'.format(name, age)Python str to bytes (преобразование строки в байты в python)
Типичная ошибка: несоответствие количества аргументов и спецификаторов в %.
'%s %d' % ('текст') # Ошибка: not enough argumentsфункция разделить python (разделение строки на список в python)
Решение: проверять число аргументов или использовать .format() с именованными параметрами.
Цель: динамическое формирование строк с подстановкой значений.
Как разбить строку на список или объединить список в строку?
Метод .split() делит строку по указанному разделителю; .join() объединяет элементы списка.
s = 'яблоко, груша, вишня'
items = s.split(', ')
# items -> ['яблоко', 'груша', 'вишня']
new_s = ' | '.join(items)
# new_s -> 'яблоко | груша | вишня'вывести первый символ строки python (вывести первый символ строки в python)
Проблема: если список содержит числа, .join() не сработает – нужны строки.
numbers = [1, 2, 3]
', '.join(numbers) # TypeErrorвывести символ строки python (вывод символа строки в python)
Решение: преобразовать элементы к строке через map(str, ...).
Цель: преобразование между строкой и коллекцией для обработки.
Как узнать длину строки и проверить вхождение подстроки?
Функция len() возвращает количество символов для unicode или байтов для str. Оператор in проверяет наличие подстроки.
s = u'Привет'
print len(s) # 6
print 'иве' in s # Trueвывести длину строки python (вывести длину строки в python)
Проблема: для байтовых строк кириллицы len() вернёт количество байтов, а не символов, если кодировка многобайтовая (UTF-8).
Решение: сначала декодировать в Unicode.
Цель: получение метрик и условий.
Как изменить регистр строки?
Методы .upper(), .lower(), .capitalize() и другие работают одинаково для обоих типов, но для unicode корректно обрабатывают локализованные символы.
s = u'Привет Мир'
print s.upper() # ПРИВЕТ МИР
print s.lower() # привет мирвывести элемент строки python (вывод конкретного символа строки по индексу в python)
Цель: унификация текста для сравнения или отображения.
Как удалить пробельные символы с краёв строки?
Метод .strip() убирает пробелы, табуляции и переводы строк; .lstrip() и .rstrip() – соответственно слева и справа.
s = ' hello world \n'
print s.strip() # 'hello world'задания на строки python (задания на строки в python)
Цель: очистка ввода пользователя или чтения из файлов.
Как заменить часть строки?
Метод .replace(old, new, count) заменяет вхождения подстроки.
s = 'one fish, two fish'
print s.replace('fish', 'cat') # 'one cat, two cat'
print s.replace('fish', 'cat', 1) # 'one cat, two fish'замена символов python (замена символов в строке python)
Цель: модификация строк по шаблону.
Как найти индекс подстроки?
Метод .find() возвращает позицию первого вхождения или -1; .index() аналогичен, но генерирует исключение при отсутствии.
s = 'Hello, world!'
print s.find('world') # 7
print s.find('Python') # -1Python первое слово в строке (извлечение первого слова из строки в python)
Цель: поиск и извлечение подстрок.
Как работать с методами проверки строк?
Методы .isdigit(), .isalpha(), .isalnum(), .isspace(), .startswith(), .endswith() возвращают булевы значения.
s = '123'
print s.isdigit() # True
print s.isalpha() # False
Цель: валидация данных.
Расширенные примеры работы со строками в Python 2
Пример 1: Кодирование и декодирование юникодной строки
# Создаём юникодную строку
s = u'Привет'
# Кодируем в UTF-8 (получаем байтовую строку)
utf8_bytes = s.encode('utf-8')
print repr(utf8_bytes)
# Результат: '\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
Декодирование обратно в Unicode:
decoded = utf8_bytes.decode('utf-8')
print decoded # Привет
Пример 2: Сравнение str и unicode строк с разными кодировками
# Байтовая строка в CP1251
s_cp1251 = '\xcf\xf0\xe8\xe2\xe5\xf2' # 'Привет' в cp1251
# Декодируем сначала в unicode
unicode_s = s_cp1251.decode('cp1251')
# Кодируем в UTF-8
text_utf8 = unicode_s.encode('utf-8')
print repr(text_utf8)
# Сравниваем с оригиналом в utf-8
print text_utf8 == 'Привет'.decode('utf-8').encode('utf-8') # True
Пример 3: Форматирование с учётом локали (unicode)
# Использование %s с юникодными строками
name = u'Мария'
age = 28
result = u'Имя: %s, возраст: %d' % (name, age)
print result # Имя: Мария, возраст: 28
# Без префикса u может возникнуть ошибка, если в строке есть не-ASCII
Пример 4: Использование raw-строк для регулярных выражений
import re
pattern = r'\d+\.\d+'
text = 'Версия 2.7 и 3.6'
matches = re.findall(pattern, text)
print matches # ['2.7', '3.6']
['2.7', '3.6']
Без raw-строки пришлось бы удваивать обратные слэши.
Пример 5: Мультистрочные строки (triple quotes)
multi = '''Первая строка
Вторая строка
Третья строка'''
print multi
# Результат:
# Первая строка
# Вторая строка
# Третья строка
Пример 6: Использование .split() с ограничением числа частей
s = 'a:b:c:d'
parts = s.split(':', 2)
print parts # ['a', 'b', 'c:d']
['a', 'b', 'c:d']
Пример 7: Метод .translate() для замены символов (только для byte strings)
from string import maketrans
# Создаём таблицу перевода: 'a' -> '1', 'b' -> '2'
table = maketrans('ab', '12')
s = 'abracadabra'
print s.translate(table) # '12r1c1d12r1'
12r1c1d12r1
Для unicode используется похожий метод, но с другими аргументами.
Пример 8: Работа с большими строками и генераторами
# Подсчёт символов без создания промежуточной строки
words = ['alpha', 'beta', 'gamma']
total_len = sum(len(w) for w in words)
print total_len # 14
Пример 9: Обработка ошибок кодировки при чтении файла
try:
with open('data.txt', 'r') as f:
content = f.read().decode('utf-8')
except UnicodeDecodeError as e:
print 'Ошибка декодирования:', e
# Альтернатива: использовать codecs.open
import codecs
with codecs.open('data.txt', 'r', 'utf-8') as f:
content = f.read()
Цель: избежать падения программы при некорректных данных.
Пример 10: Срезы строк (slicing)
s = u'Строка для срезов'
print s[0] # С
print s[-1] # в
print s[2:7] # рока
print s[::-1] # вовзерс ял акортС
С в рока вовзерс ял акортС