{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "## Работа со строками" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для удобства будем работать с длинной строкой, которая представляет собой целую фразу." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "phrase = \"питон греется на солнышке\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Наша фраза – предложение, давайте сделаем первую букву строки заглавной. " ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Питон греется на солнышке'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase = phrase.capitalize()\n", "phrase" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Метод `.capitalize()`, как и все методы на строках, не создает новую строку сам и не вносит изменения в исходную строку (строки вообще относятся к неизменяемым объектам в Python). Поэтому, чтобы сохранить внесенные изменения, мы перезаписали переменную `phrase`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проверим, правда ли, что наша новая строка начинается с заглавной *П*." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.startswith(\"П\") # правда" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А теперь проверим, правда ли, что наша фраза заканчивается точкой." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.endswith(\".\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Исправим это! Склеим нашу строку и точку (эта операция называется конкатенацией):" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Питон греется на солнышке.'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase = phrase + \".\"\n", "phrase" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь получили полноценное предложение. Давайте проверим, а правда ли, что наша фраза состоит полностью из букв (без цифр, пробелов и иных символов)?" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.isalpha() # неправда" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вполне ожидаемо: в нашей строке есть пробелы и даже точка." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Может возникнуть вопрос: а зачем нам проверять, из каких символов состоит строка? Ведь даже, если строка состоит из цифр, числом она автоматически не станет. Давайте рассмотрим две ситуации, в которых очень полезно знать, какие символы входят в нашу строку." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ситуация 1**\n", "\n", "Пользователь должен придумать пароль для своей учётной записи. Пароль должен состоять только из цифр и букв." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите пароль: pass17\n" ] } ], "source": [ "password = input(\"Введите пароль: \")\n", "\n", "if password.isalnum() == False:\n", " print(\"Пароль должен состоять только из букв и цифр!\")" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите пароль: tututu-17\n", "Пароль должен состоять только из букв и цифр!\n" ] } ], "source": [ "password = input(\"Введите пароль: \")\n", "\n", "if password.isalnum() == False:\n", " print(\"Пароль должен состоять только из букв и цифр!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В примере выше мы использовали метод `.isalnum()`, который позволяет проверить, составлена ли строка только из букв (*alpha*) и цифр (*num*)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ситуация 2**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Есть список txt-файлов, и мы хотим их автоматически рассортировать, зная, что если название файла состоит из цифр, то это текст для анализа, а если нет, то это файл с результатами анализа." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "files = [\"100.txt\", \"110.txt\", \"result1.txt\", \"121.txt\", \"result2.txt\", \"123.txt\", \"result3.txt\"]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['100.txt', '110.txt', '121.txt', '123.txt']\n", "['result1.txt', 'result2.txt', 'result3.txt']\n" ] } ], "source": [ "ans = []\n", "res = []\n", "\n", "for f in files:\n", " name = f.split(\".\")[0] # разобьем названия по точке и возьмем первый элемент - до txt\n", " if name.isnumeric():\n", " ans.append(f)\n", " else:\n", " res.append(f)\n", "print(ans)\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Понятно, что список файлов не берется из ниоткуда, плюс, обычно мы сортируем файлы не по спискам, а по папкам, но это немного другая история, можете посмотреть [тьюториал](https://www.tutorialspoint.com/python/os_file_methods.htm) по модулю `os`, который позволяет работать с файлами на компьютере, создавать папки, переименовывать их и прочее. \n", "\n", "**Внимание:** для тренировки создайте папку с ненужными или пустыми файлами,чтобы случайно ничего не повредить. Отменить действие будет невозможно!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Какие еще полезные операции можно проводить со строками? Заменять символы. Для этого есть метод `.replace()`." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "address = \"Г.Москва, ул.Мясницкая, д. 25\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Заменим сокращение \"Г.\" на слово \"город\":" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'город Москва, ул.Мясницкая, д. 25'" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "address = address.replace(\"Г.\", \"город \")\n", "address" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'город Москва, ул.Мясницкая, д.25'" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "address = address.replace(\"д. 25\", \"д.25\")\n", "address" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Методы можно «наслаивать» друг на друга: ставить точку и продолжать." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Питон греется на солнышке'" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sent = \"Питон Греется На Солнышке\"\n", "sent = sent.replace(\"Г\", \"г\").replace(\"Н\", \"н\").replace(\"С\", \"с\")\n", "sent" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Что еще полезного можно делать со строками? Менять регистр." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите имя и фамилию: аЛЛА тАМБОВЦЕВА\n" ] } ], "source": [ "name = input(\"Введите имя и фамилию: \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Знакомая история, да? Поправим:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Алла Тамбовцева'" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "name.swapcase() # ура" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Финальный аккорд: посчитаем, сколько раз разные символы встречаются в строке." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Питон греется на солнышке.'" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.count(\"е\")" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.count(\"т\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "А как найти положение слова в тексте? Для этого есть метод `.find()`." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.find(\"греется\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Это означает, что слово *греется* начинается с символа, имеющего в строке индекс 6. Проверим глазами:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Питон греется на солнышке.'" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё верно. \n", "\n", "Если такого слова (словом мы называем любую подстроку, то есть последовательность символов) в строке нет, то выводится индекс `-1`." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phrase.find(\"солнце\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }