Работа со строками в python

“Старая-школа” форматирования строк в Python

До Python 3.6 у нас было два основных способа встраивания выражений Python в строковые литералы для форматирования: % — форматирование и str.format(). Рассмотрим, как их использовать и каковы их ограничения.

Вариант #1: % — форматирование

Этот способ форматирования Python существует в языке с самого его начала. Вы можете прочитать о нем больше информации в . Имейте в виду, что % — форматирование не рекомендуется к использованию:

Как используется % — форматирование

Строковые объекты имеют встроенную операцию с использованием оператора %, который можно использовать для форматирования строк. Вот как это выглядит на практике:

>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'

Чтобы вставить более одной переменной, вы должны использовать кортеж из этих переменных.

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'

Недостатки % — форматирования

Примеры кода, которые вы только что видели выше, достаточно читабельны. Однако, как только вы начнете использовать несколько параметров и более длинные строки, ваш код быстро станет менее читаемым. Все начинает выглядеть немного грязно:

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

К сожалению, этот вид форматирования не очень хорош, потому что он многословен и приводит к ошибкам, таким как неправильное отображение кортежей или словарей. К счастью, есть альтернативы.

Вариант #2: str.format()

Этот новый способ вывода строк был представлен в Python 2.6. Вы можете обратиться к для получения дополнительной информации.

Как используется str.format()

str.format() — это улучшение % — форматирования. Он использует обычный синтаксис вызова функции и метода __format__() для объекта, преобразуемого в строку.

С помощью str.format() поля вывода переменных отмечены фигурными скобками:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'

Вы можете ссылаться на переменные в любом порядке, ссылаясь по их индексам:

>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 74.'

Но если вы вставите имена переменных, вы получите дополнительную возможность передавать объекты, а затем ссылаться на параметры и методы между фигурными скобками:

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person, age=person)
'Hello, Eric. You are 74.'

Вы также можете использовать символ **, чтобы использовать этот трек со словарями:

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'

str.format() определенно является улучшением по сравнению с % — форматированием, но и у него есть свои недостатки.

В чем недостатки str.format()

Код, использующий str.format(), гораздо легче читается, чем код, использующий % -форматирование, но str.format() все еще может быть достаточно многословным, когда вы имеете дело с несколькими параметрами и более длинными строками. Посмотрите на это:

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

Если у вас есть переменные, которые вы хотите передать в .format() в словаре, то вы можете просто распаковать его с помощью .format (** some_dict) и ссылаться на значения по ключу в строке.

Файлы и строковые переменные

Когда мы говорим «текстовая обработка», мы обычно подразумеваем обработку содержимого файла. На языке Python не составляет труда считать содержимое текстового файла в строковые переменные, где этим содержимым можно манипулировать. Файловые объекты обеспечивают три метода чтения: .read(), .readline(), and .readlines(). Каждый из этих методов может принимать аргумент для ограничения объема данных, считываемых за один раз, однако в основном они используются без аргумента. .read() считывает весь файл за один раз, и обычно используется для помещения содержимого файла в строковую переменную. Хотя .read() дает наиболее прямое строковое представление содержимого файла, он неудобен для последовательной строчно-ориентированной обработки файла, к тому же это невозможно, если размер файла превышает объем имеющейся памяти.

..readline() и .readlines() очень похожи. И та и другая используются в конструкциях наподобие следующей:

 fh = open('c:\\autoexec.bat')
for line in fh.readlines():
print line

Различие между .readline() и .readlines() в том, что последняя, как и .read(), считывает весь файл за один раз. .readlines() автоматически парсит содержимое файла в список строк, который может быть обработан с помощью конструкции языка Python for … in ….

С другой стороны, .readline() считывает только одну строку за раз, и в целом работает гораздо медленнее, чем .readlines(). .readline() следует использовать, только если памяти не хватает для считывания всего файла за один раз.

Если вы используете стандартный модуль, работающий с файлами, вы можете превратить строку в «виртуальный файл» с помощью модуля cStringIO (если требуется создание производных классов, можно использовать StringIO, но начинающим это требуется редко).

Например:

cStringIO-модуль

>>> import

                                 cStringIO
>>> fh = cStringIO.StringIO()
>>> fh.write("mary had a little lamb")
>>> fh.getvalue()
'mary had a little lamb'
>>> fh.seek(5)
>>> fh.write('ATE')
>>> fh.getvalue()
'mary ATE a little lamb'

Не забывайте, однако, что, в отличие от настоящего файла, «виртуальный файл», сформированный cStringIO — временный. Он исчезнет, когда программа завершится, если вы не предпримете каких-либо шагов, чтобы его сохранить (например, запишете его в реальный файл или воспользуетесь модулем shelve либо базой данных).

Python NumPy

NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random
Random Intro
Data Distribution
Random Permutation
Seaborn Module
Normal Distribution
Binomial Distribution
Poisson Distribution
Uniform Distribution
Logistic Distribution
Multinomial Distribution
Exponential Distribution
Chi Square Distribution
Rayleigh Distribution
Pareto Distribution
Zipf Distribution

NumPy ufunc
ufunc Intro
ufunc Create Function
ufunc Simple Arithmetic
ufunc Rounding Decimals
ufunc Logs
ufunc Summations
ufunc Products
ufunc Differences
ufunc Finding LCM
ufunc Finding GCD
ufunc Trigonometric
ufunc Hyperbolic
ufunc Set Operations

Python NumPy

NumPy IntroNumPy Getting StartedNumPy Creating ArraysNumPy Array IndexingNumPy Array SlicingNumPy Data TypesNumPy Copy vs ViewNumPy Array ShapeNumPy Array ReshapeNumPy Array IteratingNumPy Array JoinNumPy Array SplitNumPy Array SearchNumPy Array SortNumPy Array FilterNumPy Random
Random Intro
Data Distribution
Random Permutation
Seaborn Module
Normal Distribution
Binomial Distribution
Poisson Distribution
Uniform Distribution
Logistic Distribution
Multinomial Distribution
Exponential Distribution
Chi Square Distribution
Rayleigh Distribution
Pareto Distribution
Zipf Distribution

NumPy ufunc
ufunc Intro
ufunc Create Function
ufunc Simple Arithmetic
ufunc Rounding Decimals
ufunc Logs
ufunc Summations
ufunc Products
ufunc Differences
ufunc Finding LCM
ufunc Finding GCD
ufunc Trigonometric
ufunc Hyperbolic
ufunc Set Operations

2 – «Новый стиль» форматирования строк

Python 3 представил новый способ создания строкового форматирования, который также был позже бэкпортирован в Python 2.7. Форматирование строки «нового стиля» избавляется от специального синтаксиса оператора %, превращая синтаксис форматирования строк более регулярным. Теперь форматирование выполняется путем вызова функции format() для строкового объекта.

Также можно использовать функцию format() для простого позиционного форматирования, как и при форматировании «старого стиля»:

Или ссылаться на подстановки переменных по имени и использовать их в любом порядке. Это довольно мощная функция, поскольку она позволяет повторно упорядочить порядок отображения без изменения аргументов, переданных функции format:

Этот пример также показывает, изменённый синтаксис для форматирования переменной int как шестнадцатеричной строки. Теперь нужно передать спецификацию формата, добавив суффикс: x. Синтаксис строки формата стал более мощным, не усложняя более простые варианты использования.

В Python 3 форматирование строки «нового стиля» должно быть предпочтительнее, чем форматирование в стиле %. Хотя форматирование «старого стиля» считается устаревшим, но оно не удалено и по-прежнему поддерживается в крайних версиях Python. Если ссылаться на обсуждение в списках рассылки Python dev и освещение этой проблемы в bug трекере для разработчиков Python, оператор форматирования % будет присутствовать ещё долгое время.

Тем не менее, официальная документация Python 3.X не рекомендует использовать форматирование «старого стиля» и сдержанно сообщает:

«Описанные здесь операции форматирования демонстрируют множество причуд, которые приводят к ряду распространенных ошибок (например, при неправильном отображении кортежей и словарей). Использование новых форматированных строковых литералов или интерфейса str.format() помогает избежать этих ошибок. Эти альтернативы также обеспечивают более мощные, гибкие и расширяемые подходы к форматированию текста.»

Вот почему рекомендуется придерживаться str.format при написании нового кода. Начиная с Python 3.6 есть ещё один способ форматирования строк. Об этом будет рассказано в следующем разделе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector