{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=right>\n",
    "    <tr>\n",
    "        <td align=center>\n",
    "            <font size=4>Технология программирования и практикум на ЭВМ</font> \n",
    "        </td>\n",
    "        <td align=right>\n",
    "<img src=\"logoMM.png\" align=right width=120>\n",
    "        </td>\n",
    "    </tr>\n",
    "    </table>\n",
    "   "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Файлы"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"files.png\" align=right width=300>\n",
    "<b>Файл</b> (англ. file) — именованная область данных на носителе информации <br>\n",
    "<font size=-2>(Материал из Википедии — свободной энциклопедии)</font>\n",
    "<p>\n",
    "Имя файла = собственно имя + расширение<br>\n",
    "Путь к файлу - абсолютный и относительный.\n",
    "   \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Открытие и закрытие файла в Python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* Перед тем как прочесть и записать что-либо в файл, его следует открыть. Чтобы открыть файл в Python, используется встроенная функция `open()`\n",
    "* При вызове эта функция создает объект типа файл, с которым в дальнейшем можно работать:\n",
    "```python\n",
    "my_file = open (file_name, mode=режим_доступа) \n",
    "```\n",
    "* Примеры\n",
    "```python\n",
    "f = open ('1.txt', 'r')      // ok\n",
    "f = open ('c:\\1.txt', 'r')   // error !!!\n",
    "f = open (r'c:\\1.txt', 'r')  // ok\n",
    "f = open ('c:\\\\1.txt', 'r')  // ok\n",
    "```\n",
    "* Метод файлового объекта `close()` автоматически закрывает файл, при этом теряется любая несохраненная информация. Работать с файлом (читать, записывать) после этого нельзя.\n",
    "```python\n",
    "f.close()\n",
    "```\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Основные режимы доступа"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|Режим|Значение|\n",
    "|:-|:-|\n",
    "| `'r'` | Открытие на чтение <br>(является значением по умолчанию) |\n",
    "| `'w'`  | Открытие на запись. Содержимое файла удаляется. <br>Если файла не существует, создается новый.|\n",
    "|`'a'`   |Открытие на добавление информации.<br> Информация добавляется в конец файла.<br>Если файла не существует, создается новый.  |\n",
    "| `'b'`  |Открытие в двоичном режиме. |\n",
    "| `'t'`  | Открытие в текстовом режиме <br>(является значением по умолчанию). |\n",
    "| `'+'`  |Открытие на чтение и запись  |\n",
    "\n",
    "Возможны комбинации, например, `'r+'`   `'w+'` \t\t`'rb+'`\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Чтение из файла"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Метод `read()`\n",
    "* чтение информации из всего файла целиком \n",
    "(вызов без аргументов)\n",
    "* чтение $n$ символов из файла \n",
    "(вызов с аргументом &ndash; целым числом $n$)\n",
    "* Пример\n",
    "```python\n",
    "f = open('data.txt', 'r')\n",
    "s = f.read()\n",
    "```\n",
    "\n",
    "Метод `readline()`\n",
    "* чтение очередной строки из текстового файла<br>\n",
    "если достигнут конец файла, результат &ndash; пустая строка\n",
    "\n",
    "Метод `readlines()`\n",
    "* чтение всего содержимого файла текстового файла<br>\n",
    "результат &ndash; список строк\n",
    "\n",
    "\"Перебор\" строк текстового файла в цикле (файл &ndash; итерируемый объект!)\n",
    "```python\n",
    "f = open('text.txt')\n",
    "for line in f:   // перебор всех строк\t        \n",
    "    …\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Вопрос:** Как избавиться от `\\n` в конце строки?  \n",
    "**Ответ:**    Использовать метод `rstrip()` строки:\n",
    "```python\n",
    "\tfor line in f:\n",
    "\t    line = line.rstrip()\n",
    "        ...\n",
    "```        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Запись в файл"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Метод `write()`\n",
    "* Пример\n",
    "```python\n",
    "f = open('data.txt', 'a')\n",
    "f.write('hello!')\n",
    "```\n",
    "* Допустим только один аргумент\n",
    "* Аргумент должен иметь тип `str`\n",
    "* Для перевода строки добавляем `'\\n'`\n",
    "\n",
    "Функция `print()` с параметром `file=…`\n",
    "* Пример\n",
    "```python\n",
    "f = open('data.txt', 'a')\n",
    "print('hello!', 12345, 'hello!', file = f)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Доступ к функциям операционной системы: модуль `os`*\n",
    "\n",
    "\n",
    "<font size = 1>*Разумеется, модуль `os` содержит не две функции, а несколько десятков. Но для решения задач про файлы без упомянутых ниже двух точно не обойтись.\n",
    "</font>    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Удаление файла\t\t\n",
    "```python\n",
    "os.remove(file_name) \n",
    "```\n",
    "* `file_name` &ndash; это строка с именем файла, а не файловая переменная\n",
    "* строка `file_name`  должна содержать полный путь + имя файла; для файла в текущей папке путь можно опускать\n",
    "* файл не должен быть открыт в программе\n",
    "\n",
    "Переименование файла \n",
    "```python\n",
    "os.rename(old_name, new_name)\n",
    "```\n",
    "* см. все предыдущие замечания по поводу `file_name`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задачи по теме \"Файлы\"\n",
    "\n",
    "<div align=\"right\">\n",
    "Найдено в интернете...\n",
    "    </div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Задача 1.** Дан текстовый файл `data1.txt`. Определите сколько в нем букв (латинского алфавита), слов, строк.  \n",
    "Выведите три найденных числа в следующем формате:\n",
    "```\n",
    "Input file contains:\n",
    "... letters\n",
    "... words\n",
    "... lines\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['__add__',\n",
       " '__class__',\n",
       " '__contains__',\n",
       " '__delattr__',\n",
       " '__dir__',\n",
       " '__doc__',\n",
       " '__eq__',\n",
       " '__format__',\n",
       " '__ge__',\n",
       " '__getattribute__',\n",
       " '__getitem__',\n",
       " '__getnewargs__',\n",
       " '__gt__',\n",
       " '__hash__',\n",
       " '__init__',\n",
       " '__init_subclass__',\n",
       " '__iter__',\n",
       " '__le__',\n",
       " '__len__',\n",
       " '__lt__',\n",
       " '__mod__',\n",
       " '__mul__',\n",
       " '__ne__',\n",
       " '__new__',\n",
       " '__reduce__',\n",
       " '__reduce_ex__',\n",
       " '__repr__',\n",
       " '__rmod__',\n",
       " '__rmul__',\n",
       " '__setattr__',\n",
       " '__sizeof__',\n",
       " '__str__',\n",
       " '__subclasshook__',\n",
       " 'capitalize',\n",
       " 'casefold',\n",
       " 'center',\n",
       " 'count',\n",
       " 'encode',\n",
       " 'endswith',\n",
       " 'expandtabs',\n",
       " 'find',\n",
       " 'format',\n",
       " 'format_map',\n",
       " 'index',\n",
       " 'isalnum',\n",
       " 'isalpha',\n",
       " 'isascii',\n",
       " 'isdecimal',\n",
       " 'isdigit',\n",
       " 'isidentifier',\n",
       " 'islower',\n",
       " 'isnumeric',\n",
       " 'isprintable',\n",
       " 'isspace',\n",
       " 'istitle',\n",
       " 'isupper',\n",
       " 'join',\n",
       " 'ljust',\n",
       " 'lower',\n",
       " 'lstrip',\n",
       " 'maketrans',\n",
       " 'partition',\n",
       " 'replace',\n",
       " 'rfind',\n",
       " 'rindex',\n",
       " 'rjust',\n",
       " 'rpartition',\n",
       " 'rsplit',\n",
       " 'rstrip',\n",
       " 'split',\n",
       " 'splitlines',\n",
       " 'startswith',\n",
       " 'strip',\n",
       " 'swapcase',\n",
       " 'title',\n",
       " 'translate',\n",
       " 'upper',\n",
       " 'zfill']"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dir(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input file contains:\n",
      "184 letters\n",
      "36 words\n",
      "9 lines\n"
     ]
    }
   ],
   "source": [
    "# Решение\n",
    "n_lines = 0\n",
    "n_words = 0\n",
    "n_letters = 0\n",
    "f = open('data1.txt', 'r')\n",
    "for line in f:\n",
    "    n_lines += 1\n",
    "    n_words += len(line.split())\n",
    "    for c in line:\n",
    "        if c.isalpha():\n",
    "            n_letters += 1\n",
    "f.close()            \n",
    "print('Input file contains:')\n",
    "print(f'{n_letters} letters')\n",
    "print(f'{n_words} words')\n",
    "print(f'{n_lines} lines')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Задача 2.** В файле могут быть записаны любые символы, в том числе десятичные цифры. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).  Вычислите сумму всех чисел, записанных в файле `data2.txt`.<br>\n",
    "*В данной задаче удобно считывать данные посимвольно.*\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2594\n"
     ]
    }
   ],
   "source": [
    "# Решение. \n",
    "f = open('data2.txt')\n",
    "s = 0\n",
    "num = ''\n",
    "c = f.read(1)\n",
    "while c!='':\n",
    "    if c.isdigit():\n",
    "        num += c\n",
    "    else:\n",
    "        if num:\n",
    "            s += int(num)\n",
    "            num = ''     \n",
    "    c = f.read(1)\n",
    "if num:\n",
    "    s += int(num)    \n",
    "print(s)\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Задача 3**. В олимпиаде по информатике принимало участие несколько человек. Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу. Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.\n",
    "\n",
    "**Входные данные:**\\\n",
    "Информация о результатах олимпиады записана в файле, `data3.txt`, каждая строка которого имеет вид: <br> \n",
    "`фамилия имя класс балл`\n",
    "* `фамилия` и `имя` — текстовые строки, не содержащие пробелов. \n",
    "* `класс` - одно из трех чисел 9, 10, 11. \n",
    "* `балл` - целое число от 0 до 100. \n",
    "\n",
    "**Выходные данные:**\\\n",
    "Три числа:  баллы победителя олимпиады по 9, по 10 и по 11 классу соответственно.\n",
    "\n",
    "*В этой задаче файл необходимо считывать построчно, не сохраняя содержимое файла в памяти целиком.*\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Решение\n",
    "f = open('data3.txt')\n",
    "res = [0, 0, 0] #9, 10, 11 класс\n",
    "for line in f:\n",
    "    _, _, klass, ball = line.rstrip().split()\n",
    "    klass = int(klass)\n",
    "    ball = int(ball)\n",
    "    res[klass-9] = max(res[klass-9], ball)\n",
    "f.close()\n",
    "print(res)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Задачи с сайта ptaskbook.com**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Text1.** Дано имя файла и целые положительные числа N и K. Создать текстовый файл с указанным именем и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n = 5\n",
      "k = 4\n"
     ]
    }
   ],
   "source": [
    "# Решение\n",
    "name = 'stars.txt'\n",
    "n = int(input('n = '))\n",
    "k = int(input('k = '))\n",
    "f = open(name, 'w')\n",
    "for _ in range(n):\n",
    "    f.write('*' * k +'\\n')\n",
    "f.close()    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Text5.** Дана строка S и текстовый файл. Добавить строку S в конец файла."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Решение\n",
    "s = 'hello'\n",
    "file_name = 'stars.txt'\n",
    "f = open(file_name, 'a')\n",
    "print(s, file=f)\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Text6.** Даны два текстовых файла.  Добавить в конец первого файла содержимое второго файла."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Решение\n",
    "name1 = 'stars.txt'\n",
    "name2 = 'data1.txt'\n",
    "..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Text7.** Дана строка S и текстовый файл. Добавить строку S в начало файла."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Решение\n",
    "import os\n",
    "s = 'hello!!!'\n",
    "name = 'stars.txt'\n",
    "f = open(name, 'r')\n",
    "g = open(name+'.$#$', 'w')\n",
    "print(s, file=g)\n",
    "for line in f:\n",
    "    g.write(line)\n",
    "f.close()\n",
    "g.close()\n",
    "os.remove(name)\n",
    "os.rename(name+'.$#$', name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Питонский стиль / Pythonic style"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Знатоки Питона работают с файлами, используя конструкцию `with … as:`\n",
    "```python\n",
    "      with open(\"x.txt\") as f:\n",
    "        data = f.read()\n",
    "        ## обрабатываем строчку и тп\n",
    "```        \n",
    "\n",
    "Такая конструкция с одной стороны не требует явного закрытия файла (не нужно писать `f.close()`), а с другой – гарантирует закрытие файла в любом случае, какие бы ситуации не возникли в процессе его обработки.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"War_and_Peace.png\" align = left width = 150  style=\"margin:0px 20px 0px 0px\">\n",
    "\n",
    "**Задача 4.** \n",
    "\n",
    "В файле `book.txt` содержатся  два тома знаменитого романа Л.Н.Толстого \"Война и мир\". Определите, имя какого персонажа встречается в этом файле чаще всего?\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('Пьер', 613), ('Андрей', 587), ('Наташа', 497), ('Ростов', 430), ('Князь', 310), ('Николай', 240), ('Марья', 235), ('Соня', 194), ('Пьера', 187), ('Анна', 184), ('Нет', 157), ('Долохов', 155), ('Денисов', 154), ('Андрея', 151), ('Борис', 148), ('Василий', 138), ('Анатоль', 135), ('Ростова', 120), ('Когда', 112), ('Элен', 109)]\n"
     ]
    }
   ],
   "source": [
    "# Решение\n",
    "f = open('book1.txt')\n",
    "d = {}\n",
    "for line in f:\n",
    "    names = [w for w in line.rstrip().split() if len(w)>3 and w[0].isupper()]\n",
    "    for i in range(len(names)):\n",
    "        if not names[i][-1].isalpha():\n",
    "            names[i] = names[i][:-1]\n",
    "    for name in names:\n",
    "        d[name] = d.get(name,0)+1\n",
    "f.close()\n",
    "words = sorted(d.items(), key=lambda x:x[1], reverse=True)\n",
    "print(words[:20])\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "attachments": {
    "rue3c19a797c5.jpg": {
     "image/jpeg": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![rue3c19a797c5.jpg](attachment:rue3c19a797c5.jpg)\n",
    "\n",
    "## Финальная задача\n",
    "для самостоятельного анализа\n",
    "\n",
    "<div align=right>\n",
    "    <i>Посвящается наступившему перерыву в чемпионате России по футболу.</i>\n",
    "    </div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Дан текстовый файл, содержащий результаты матчей футбольного турнира в формате\n",
    "\n",
    "|Команда1-Команда2|Счет|\n",
    "|:--|:--|\n",
    "|Локомотив-Химки|1 : 1|\n",
    "|Спартак-Ахмат|2 : 0|\n",
    "|ЦСКА-Зенит|0 : 2|\n",
    "\n",
    "\n",
    "На основании этого файла создать таблицу турнира в следующем формате: \n",
    "\n",
    "<div align=center>\n",
    "<img src=\"table.jpg\" width=300>\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done. Cm. file\n"
     ]
    }
   ],
   "source": [
    "# Решение\n",
    "# 1. Структура данных\n",
    "# [И, Поб, Н, Пор, Заб, Проп]\n",
    "#  0   1   2   3    4     5\n",
    "# {'НазваниеКоманды' : [...], ...}\n",
    "\n",
    "# 2. Ввод из файла и обработка\n",
    "table = {}\n",
    "f = open('soccer_rus.txt')\n",
    "for line in f:\n",
    "    teams, score = line.rstrip().split()\n",
    "    team1, team2 = teams.split('-')\n",
    "    data1 = table.get(team1, [0]*6)\n",
    "    data2 = table.get(team2, [0]*6)\n",
    "    goal1, goal2 = map(int, score.split(':'))\n",
    "    data1[0] += 1\n",
    "    data2[0] += 1\n",
    "    data1[4] += goal1\n",
    "    data2[4] += goal2\n",
    "    data1[5] += goal2\n",
    "    data2[5] += goal1\n",
    "    if goal1>goal2:\n",
    "        data1[1] += 1\n",
    "        data2[3] += 1\n",
    "    elif goal1<goal2:\n",
    "        data2[1] += 1\n",
    "        data1[3] += 1\n",
    "    else:\n",
    "        data1[2] += 1\n",
    "        data2[2] += 1 \n",
    "    table[team1] = data1\n",
    "    table[team2] = data2\n",
    "f.close()        \n",
    "\n",
    "# 3. Вывод \"красивой\" таблички\n",
    "\n",
    "def score(data):\n",
    "    return data[1]*3 + data[2]*1\n",
    "\n",
    "def print_team(t):\n",
    "    g = open('table_res.txt', 'a')\n",
    "    d = table[t]\n",
    "    print(f'{t:15} {d[0]} {d[1]:2}/{d[2]:2}/{d[3]:2} {d[4]:2}-{d[5]:2}  {score(d)}', file=g)\n",
    "    g.close()\n",
    "\n",
    "teams = table.keys()\n",
    "teams = sorted(teams, key=lambda x:-score(table[x]))\n",
    "for t in teams:\n",
    "    print_team(t)\n",
    "print('Done. Cm. file')    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
