{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "standing-contrast",
   "metadata": {},
   "source": [
    "# Aula 06: Arquivos\n",
    "\n",
    "Não tenho como enfatizar a importância de saber armazenar dados em disco!\n",
    "\n",
    "Aqui vamos ver os fundamentos de como trabalhar com arquivos.\n",
    "\n",
    "Existem pacotes que permitem trabalhar com formatos de arquivos específicos:\n",
    "\n",
    " * [Na biblioteca padrão do Python](https://docs.python.org/pt-br/3/library/index.html) tem vários\n",
    "   - Bancos de dados: `sqlite3` e `dbm`\n",
    "   - Arquivos comprimidos: `zlib`, `gzip`, `bz2`, `lzma`, `zipfile`, `tarfile` \n",
    "   - `json`, `html`, `xml`\n",
    "   - `csv`\n",
    "   - Outros\n",
    " * Pacotes\n",
    "  - Tudo quanto é banco de dados\n",
    "  - Excel: [pandas](https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html), [openpyxl](https://openpyxl.readthedocs.io/en/stable/), [xlrd](https://xlrd.readthedocs.io/en/latest/). Ver também <https://www.python-excel.org>\n",
    "  - HDF5: <https://docs.h5py.org/en/stable/>\n",
    "  - [Pandas](https://pandas.pydata.org/) tem um monte de coisa para diferentes formatos \n",
    "  - Figuras bitmap: [Pillow](https://pillow.readthedocs.io/en/stable/)\n",
    "  - Um monte de outras coisas...\n",
    "\n",
    "**Vamos tratar aqui dos fundamentos**\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "alleged-ministry",
   "metadata": {},
   "source": [
    "## Abrindo arquivos\n",
    "\n",
    "Função `open` abre o arquivo:\n",
    "\n",
    "```\n",
    "f = open(nome_do_arquivo_string, modo)\n",
    "```\n",
    "Nome do arquivo deve ser uma string e a função `open` retorna um objeto do tipo `file` (arquivo em inglês).\n",
    "\n",
    "### Modo de abertura\n",
    "\n",
    "| Modo | Operações |\n",
    "| ---- | --------- |\n",
    "| r    | Leitura   |\n",
    "| w    | Escrita - apaga o conteúdo que tiver  |\n",
    "| a    | Escrita - preserva o conteúdo que tiver|\n",
    "| b    | Modo binário |\n",
    "| +    | Atualização (leitura e escrita) |\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "statistical-elder",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Escrevendo um arquivo\n",
    "arquivo = open(\"números.txt\", \"w\")\n",
    "for linha in range(1,101):\n",
    "    arquivo.write(f\"{linha}\\n\")\n",
    "arquivo.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "binding-consistency",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Lendo um arquivo\n",
    "arquivo = open(\"números.txt\", \"r\")\n",
    "linhas = arquivo.readlines()\n",
    "arquivo.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "appointed-vitamin",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1\\n',\n",
       " '2\\n',\n",
       " '3\\n',\n",
       " '4\\n',\n",
       " '5\\n',\n",
       " '6\\n',\n",
       " '7\\n',\n",
       " '8\\n',\n",
       " '9\\n',\n",
       " '10\\n',\n",
       " '11\\n',\n",
       " '12\\n',\n",
       " '13\\n',\n",
       " '14\\n',\n",
       " '15\\n',\n",
       " '16\\n',\n",
       " '17\\n',\n",
       " '18\\n',\n",
       " '19\\n',\n",
       " '20\\n',\n",
       " '21\\n',\n",
       " '22\\n',\n",
       " '23\\n',\n",
       " '24\\n',\n",
       " '25\\n',\n",
       " '26\\n',\n",
       " '27\\n',\n",
       " '28\\n',\n",
       " '29\\n',\n",
       " '30\\n',\n",
       " '31\\n',\n",
       " '32\\n',\n",
       " '33\\n',\n",
       " '34\\n',\n",
       " '35\\n',\n",
       " '36\\n',\n",
       " '37\\n',\n",
       " '38\\n',\n",
       " '39\\n',\n",
       " '40\\n',\n",
       " '41\\n',\n",
       " '42\\n',\n",
       " '43\\n',\n",
       " '44\\n',\n",
       " '45\\n',\n",
       " '46\\n',\n",
       " '47\\n',\n",
       " '48\\n',\n",
       " '49\\n',\n",
       " '50\\n',\n",
       " '51\\n',\n",
       " '52\\n',\n",
       " '53\\n',\n",
       " '54\\n',\n",
       " '55\\n',\n",
       " '56\\n',\n",
       " '57\\n',\n",
       " '58\\n',\n",
       " '59\\n',\n",
       " '60\\n',\n",
       " '61\\n',\n",
       " '62\\n',\n",
       " '63\\n',\n",
       " '64\\n',\n",
       " '65\\n',\n",
       " '66\\n',\n",
       " '67\\n',\n",
       " '68\\n',\n",
       " '69\\n',\n",
       " '70\\n',\n",
       " '71\\n',\n",
       " '72\\n',\n",
       " '73\\n',\n",
       " '74\\n',\n",
       " '75\\n',\n",
       " '76\\n',\n",
       " '77\\n',\n",
       " '78\\n',\n",
       " '79\\n',\n",
       " '80\\n',\n",
       " '81\\n',\n",
       " '82\\n',\n",
       " '83\\n',\n",
       " '84\\n',\n",
       " '85\\n',\n",
       " '86\\n',\n",
       " '87\\n',\n",
       " '88\\n',\n",
       " '89\\n',\n",
       " '90\\n',\n",
       " '91\\n',\n",
       " '92\\n',\n",
       " '93\\n',\n",
       " '94\\n',\n",
       " '95\\n',\n",
       " '96\\n',\n",
       " '97\\n',\n",
       " '98\\n',\n",
       " '99\\n',\n",
       " '100\\n']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "linhas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "respiratory-prompt",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n",
      "10\n",
      "11\n",
      "12\n",
      "13\n",
      "14\n",
      "15\n",
      "16\n",
      "17\n",
      "18\n",
      "19\n",
      "20\n",
      "21\n",
      "22\n",
      "23\n",
      "24\n",
      "25\n",
      "26\n",
      "27\n",
      "28\n",
      "29\n",
      "30\n",
      "31\n",
      "32\n",
      "33\n",
      "34\n",
      "35\n",
      "36\n",
      "37\n",
      "38\n",
      "39\n",
      "40\n",
      "41\n",
      "42\n",
      "43\n",
      "44\n",
      "45\n",
      "46\n",
      "47\n",
      "48\n",
      "49\n",
      "50\n",
      "51\n",
      "52\n",
      "53\n",
      "54\n",
      "55\n",
      "56\n",
      "57\n",
      "58\n",
      "59\n",
      "60\n",
      "61\n",
      "62\n",
      "63\n",
      "64\n",
      "65\n",
      "66\n",
      "67\n",
      "68\n",
      "69\n",
      "70\n",
      "71\n",
      "72\n",
      "73\n",
      "74\n",
      "75\n",
      "76\n",
      "77\n",
      "78\n",
      "79\n",
      "80\n",
      "81\n",
      "82\n",
      "83\n",
      "84\n",
      "85\n",
      "86\n",
      "87\n",
      "88\n",
      "89\n",
      "90\n",
      "91\n",
      "92\n",
      "93\n",
      "94\n",
      "95\n",
      "96\n",
      "97\n",
      "98\n",
      "99\n",
      "100\n"
     ]
    }
   ],
   "source": [
    "arquivo = open(\"números.txt\", \"r\")\n",
    "for linha in arquivo.readlines():\n",
    "    print(linha.strip())\n",
    "arquivo.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "rotary-cricket",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n",
      "10\n",
      "11\n",
      "12\n",
      "13\n",
      "14\n",
      "15\n",
      "16\n",
      "17\n",
      "18\n",
      "19\n",
      "20\n",
      "21\n",
      "22\n",
      "23\n",
      "24\n",
      "25\n",
      "26\n",
      "27\n",
      "28\n",
      "29\n",
      "30\n",
      "31\n",
      "32\n",
      "33\n",
      "34\n",
      "35\n",
      "36\n",
      "37\n",
      "38\n",
      "39\n",
      "40\n",
      "41\n",
      "42\n",
      "43\n",
      "44\n",
      "45\n",
      "46\n",
      "47\n",
      "48\n",
      "49\n",
      "50\n",
      "51\n",
      "52\n",
      "53\n",
      "54\n",
      "55\n",
      "56\n",
      "57\n",
      "58\n",
      "59\n",
      "60\n",
      "61\n",
      "62\n",
      "63\n",
      "64\n",
      "65\n",
      "66\n",
      "67\n",
      "68\n",
      "69\n",
      "70\n",
      "71\n",
      "72\n",
      "73\n",
      "74\n",
      "75\n",
      "76\n",
      "77\n",
      "78\n",
      "79\n",
      "80\n",
      "81\n",
      "82\n",
      "83\n",
      "84\n",
      "85\n",
      "86\n",
      "87\n",
      "88\n",
      "89\n",
      "90\n",
      "91\n",
      "92\n",
      "93\n",
      "94\n",
      "95\n",
      "96\n",
      "97\n",
      "98\n",
      "99\n",
      "100\n"
     ]
    }
   ],
   "source": [
    "# with\n",
    "with open(\"números.txt\", \"r\") as arquivo:\n",
    "    for linha in arquivo.readlines():\n",
    "        print(linha.strip())\n",
    "# Ele já fecha automaticamente o arquivo mesmo se um erro ocorrer"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "consistent-neighborhood",
   "metadata": {},
   "source": [
    "## Parâmetros da linha de comando\n",
    "\n",
    "Ver o script `linhadecomando.py`\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "molecular-holly",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Número de parâmetros: 3\n",
      "Parâmetro 0: /usr/lib/python3.10/site-packages/ipykernel_launcher.py\n",
      "Parâmetro 1: -f\n",
      "Parâmetro 2: /home/pjabardo/.local/share/jupyter/runtime/kernel-6d6d8ced-60a0-42b2-816b-ea3bbf91c07a.json\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(f\"Número de parâmetros: {len(sys.argv)}\")\n",
    "for n, p in enumerate(sys.argv):\n",
    "    print(f\"Parâmetro {n}: {p}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "danish-joshua",
   "metadata": {},
   "source": [
    "### Exercício 1\n",
    "Escreva um programa que receba o nome de um arquivo pela linha de comando e imprimia todas as linhas desse aqruivo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "soviet-estonia",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "traditional-treaty",
   "metadata": {},
   "source": [
    "### Exercício 2\n",
    "Modofique o programa do exercício de tal modo que receba mais dois parâmetros: a linha de incício e a de fim de impressão. O programa deve imprimir apenas as linhas entre esses dois valores (inlcuindo as linhas de incício e fim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "executive-choir",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "related-statement",
   "metadata": {},
   "source": [
    "## Geração de arquivos\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "opposite-tonight",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"ímpares.txt\", \"w\") as ímpares:\n",
    "    with open(\"pares.txt\", \"w\") as pares:\n",
    "        for n in range(1000):\n",
    "            if n % 2 == 0:\n",
    "                pares.write(f\"{n}\\n\")\n",
    "            else:\n",
    "                ímpares.write(f\"{n}\\n\")\n",
    "                "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "nervous-ozone",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"ímpares.txt\", \"w\") as ímpares, open(\"pares.txt\", \"w\") as pares:\n",
    "    for n in range(1000):\n",
    "        if n % 2 == 0:\n",
    "            pares.write(f\"{n}\\n\")\n",
    "        else:\n",
    "            ímpares.write(f\"{n}\\n\")\n",
    "                "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "australian-dinner",
   "metadata": {},
   "source": [
    "## Leitura e escrita\n",
    "\n",
    "É muito comum ler um arquivo e processá-lo e escrever em outro arquivo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "accepting-emperor",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"multiplos_de_4.txt\", \"w\") as múltiplos4, open(\"pares.txt\", \"r\") as pares:\n",
    "    for l in pares.readlines():\n",
    "        if int(l) % 4 == 0:\n",
    "            múltiplos4.write(l)\n",
    "            "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "extraordinary-manitoba",
   "metadata": {},
   "source": [
    "### Exercício 3\n",
    "Crie um programa que receba o nome de dois arquivos como parâmetros da linha de comando e que gere um arquivo de saída com as linhas do primeiro e do segundo arquivo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "alleged-soldier",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "settled-burns",
   "metadata": {},
   "source": [
    "### Exercício 4\n",
    "Crie um programa que recebe o nome de um arquivo e o nome do arquivo de saída e que inverta as linhas do primeiro arquivo e armazene no segundo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "available-light",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "compatible-clause",
   "metadata": {},
   "source": [
    "## Geração de HTML\n",
    "\n",
    "Uma das operações mais importantes da web!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "analyzed-focus",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"página.html\", \"w\", encoding=\"utf-8\") as página:\n",
    "    página.write('<!DOCTYPE html>\\n')\n",
    "    página.write('<html lang=\"pt-br\">\\n')\n",
    "    página.write('<head>\\n')\n",
    "    página.write('<meta charset=\"utf-8\">\\n')\n",
    "    página.write('<title>Título da página</title>\\n')\n",
    "    página.write('</head>\\n')\n",
    "    página.write('<body>\\n')\n",
    "    página.write('Olá!\\n')\n",
    "    for l in range(10):\n",
    "        página.write(f\"<p>{l}</p>\\n\")\n",
    "    página.write('</body>\\n')\n",
    "    página.write('</html>\\n')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fatty-liabilities",
   "metadata": {},
   "source": [
    "Algumas coisinhas importantes:\n",
    "\n",
    " * argumento `encoding = \"utf-8\"`\n",
    " * Usando `'` e/ou `\"`\n",
    " \n",
    "Mas é chato ficar escrevendo esse monte de coisa. Lembra das aspas triplas que eu falei?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "featured-coordinate",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"página.html\", \"w\", encoding=\"utf-8\") as página:\n",
    "    página.write(\"\"\"\n",
    "<!DOCTYPE html>\n",
    "<html lang=\"pt-br\">\n",
    "<head>\n",
    "<meta charset=\"utf-8\">\n",
    "<title>Título da página</title>\n",
    "</head>\n",
    "<body>\n",
    "Olá!\n",
    "    \"\"\")\n",
    "    for l in range(10):\n",
    "        página.write(f\"<p>{l}</p>\\n\")\n",
    "    página.write(\"\"\"\n",
    "</body>\n",
    "</html>\n",
    "    \"\"\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "brown-gospel",
   "metadata": {},
   "source": [
    "Algo mais sofisticado: gerando a página web a partir de dados. No caso, um dicionário com filmes, gênero do filme, título."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "clear-excess",
   "metadata": {},
   "outputs": [],
   "source": [
    "filmes = {\n",
    "    \"drama\" : [\"O Homem Elefante\", \"O Poderoso Chefão\"],\n",
    "    \"comédia\" : [\"Se beber não case\", \"O Auto da Compadecida\", \"American Pie\"],\n",
    "    \"policial\" : [\"Seven\", \"O silêncio dos inocentes\", \"Os Homens que não Amavam as Mulheres\"],\n",
    "    \"guerra\" : [\"Stalingrado\", \"O Resgate do Soldado Ryan\", \"Dunquerque\"],\n",
    "    \"ficção científica\" : [\"O Expresso do Amanhã\", \"Duna\", \"Guerra nas Estrelas\", \"A Ira de Kahn\"]\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "composed-coordination",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"filmes.html\", \"w\", encoding=\"utf-8\") as página:\n",
    "    página.write(\"\"\"\n",
    "<!DOCTYPE html>\n",
    "<html lang=\"pt-br\">\n",
    "<head>\n",
    "<meta charset=\"utf-8\">\n",
    "<title>Filmes</title>\n",
    "</head>\n",
    "<body>\n",
    "    \"\"\")\n",
    "    for c,v in filmes.items():\n",
    "        página.write(f\"<h1>{c.capitalize()}</h1>\\n\")\n",
    "        for e in v:\n",
    "            página.write(f\"<h2>{e}</h2>\\n\")\n",
    "    página.write(\"\"\"\n",
    "</body>\n",
    "</html>\n",
    "    \"\"\")\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "daily-shannon",
   "metadata": {},
   "source": [
    "### Exercício 5\n",
    "Modofique o programa anterior para utilizar o elemento `p` em vez de `h2`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "facial-rugby",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "statistical-friendly",
   "metadata": {},
   "source": [
    "### Exercício 6\n",
    "Modofique o programa 9.8 para gerar uma lista html usando os elementos `ul` e `li`. Todos os elementos da lista devem estar dentro do elemento `ul` e cada item dentro de um elemento `li`. Exemplo:\n",
    "\n",
    "`<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "activated-tracy",
   "metadata": {},
   "source": [
    "## Arquivos e diretórios\n",
    "\n",
    "Sabe aqueles comandos que você usa na linha de comando? Dá para fazer o mesmo de dentro do Python."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "certain-pendant",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "rapid-citizenship",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/home/pjabardo/Documents/assipt/pythonassipt/work'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get current working directory (qual o diretório atual?)\n",
    "os.getcwd() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "coral-ownership",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Criar diretórios: make directory (mkdir)\n",
    "os.mkdir(\"a\")\n",
    "os.mkdir(\"b\")\n",
    "os.mkdir(\"c\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "wooden-ebony",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/pjabardo/Documents/assipt/pythonassipt/work/a\n"
     ]
    }
   ],
   "source": [
    "# Mudar o diretório atual: change directory (chdir)\n",
    "os.chdir(\"a\")\n",
    "print(os.getcwd())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "lyric-shark",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/pjabardo/Documents/assipt/pythonassipt/work\n"
     ]
    }
   ],
   "source": [
    "os.chdir(\"..\")\n",
    "print(os.getcwd())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "proper-liberia",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/pjabardo/Documents/assipt/pythonassipt/work/b\n"
     ]
    }
   ],
   "source": [
    "os.chdir(\"b\")\n",
    "print(os.getcwd())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "dated-empty",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/pjabardo/Documents/assipt/pythonassipt/work/c\n"
     ]
    }
   ],
   "source": [
    "os.chdir(\"../c\")\n",
    "print(os.getcwd())\n",
    "os.chdir(\"..\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "dirty-lunch",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Apagar diretório **vazio**\n",
    "os.rmdir(\"a\")\n",
    "os.rmdir(\"b\")\n",
    "os.rmdir(\"c\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "genuine-spare",
   "metadata": {},
   "outputs": [],
   "source": [
    "# mkdir cria um diretório de cada vez. makedirs cria toda a árvore:\n",
    "os.makedirs(\"a/b/c/d\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "contrary-amplifier",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Apagando os diretórios que estiverem vazios na árvore\n",
    "os.removedirs(\"a/b/c/d\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "resistant-marine",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Mudando nomes de arquivos e diretórios\n",
    "os.makedirs(\"avô/pai/filho\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "tamil-landscape",
   "metadata": {},
   "outputs": [],
   "source": [
    "os.rename(\"avô/pai\", \"avô/mãe\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "funded-cattle",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['06-funcoes.ipynb',\n",
       " 'pares.txt',\n",
       " 'linhadecomando.py',\n",
       " '.ipynb_checkpoints',\n",
       " 'filmes.html',\n",
       " 'ímpares.txt',\n",
       " 'página.html',\n",
       " 'ola.html',\n",
       " 'números.txt',\n",
       " '06-Arquivos.ipynb',\n",
       " 'multiplos_de_4.txt',\n",
       " 'avô']"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Dá também para listar os diretórios:\n",
    "os.listdir(\".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "contained-assembly",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['mãe']"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.listdir(\"avô\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "neither-universal",
   "metadata": {},
   "source": [
    "## Nomes de arquivos: `os.path`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "square-reform",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os.path  # Funções que trabalham com nomes de arquivos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "overall-psychiatry",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "06-funcoes.ipynb\n",
      "pares.txt\n",
      "linhadecomando.py\n",
      ".ipynb_checkpoints/\n",
      "filmes.html\n",
      "ímpares.txt\n",
      "página.html\n",
      "ola.html\n",
      "números.txt\n",
      "06-Arquivos.ipynb\n",
      "multiplos_de_4.txt\n",
      "avô/\n"
     ]
    }
   ],
   "source": [
    "for a in os.listdir(\".\"):\n",
    "    if os.path.isdir(a):  # É uma pasta?\n",
    "        print(f\"{a}/\")\n",
    "    elif os.path.isfile(a):\n",
    "        print(a)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "convenient-reputation",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'06-Arquivos.ipynb'"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Nome base\n",
    "os.path.basename(\"06-Arquivos.ipynb\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "related-disclosure",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/pjabardo/Documents/assipt/pythonassipt/06-aula\n",
      "06-Arquivos.ipynb\n"
     ]
    }
   ],
   "source": [
    "# Dividir o nome em partes:\n",
    "for s in os.path.split(\"/home/pjabardo/Documents/assipt/pythonassipt/06-aula/06-Arquivos.ipynb\"):\n",
    "    print(s)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "buried-pillow",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('06-Arquivos', '.ipynb')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.path.splitext(\"06-Arquivos.ipynb\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "extensive-cherry",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'../05-aula'"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.path.dirname(\"../05-aula/utilidades.py\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "mighty-freight",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'home/pjabardo/Documents/assipt'"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Juntar os nomes:\n",
    "\n",
    "os.path.join(\"home\", \"pjabardo\", \"Documents\", \"assipt\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "painted-coating",
   "metadata": {},
   "source": [
    "## Visitando todos os subdiretórios recursivamente\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "biological-section",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Caminho: ../pagina-web/\n",
      "  pythonassipt/\n",
      "1 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt\n",
      "  __pycache__/\n",
      "  output/\n",
      "  posts/\n",
      "  cache/\n",
      "  themes/\n",
      "  images/\n",
      "  .doit.db\n",
      "  conf.py\n",
      "6 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/__pycache__\n",
      "  conf.cpython-310.pyc\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output\n",
      "  categories/\n",
      "  posts/\n",
      "  2022/\n",
      "  assets/\n",
      "  images/\n",
      "  index-1.html\n",
      "  sitemapindex.xml\n",
      "  sitemap.xml\n",
      "  robots.txt\n",
      "  index.html\n",
      "  archive.html\n",
      "  rss.xml\n",
      "5 diretório(s), 7 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories\n",
      "  assipt/\n",
      "  git/\n",
      "  programacao/\n",
      "  introducao/\n",
      "  spyder/\n",
      "  github/\n",
      "  instalacao/\n",
      "  python/\n",
      "  controle-de-versao/\n",
      "  git.xml\n",
      "  spyder.xml\n",
      "  introducao.xml\n",
      "  assipt.xml\n",
      "  controle-de-versao.xml\n",
      "  programacao.xml\n",
      "  index.html\n",
      "  python.xml\n",
      "  github.xml\n",
      "  instalacao.xml\n",
      "9 diretório(s), 10 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/assipt\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/git\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/programacao\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/introducao\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/spyder\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/github\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/instalacao\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/python\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/categories/controle-de-versao\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts\n",
      "  git-e-github/\n",
      "  pyodide/\n",
      "  miniconda/\n",
      "  exercicios-da-aula-04/\n",
      "  04-aula-estruturas-de-dados-2-e-strings/\n",
      "  python-no-android/\n",
      "  05-aula/\n",
      "  01-introducao-e-primeiros-passos/\n",
      "  repositorio-do-curso/\n",
      "  exercicios-da-aula-03/\n",
      "  aula-02-exercicios/\n",
      "  01-exercicios/\n",
      "  python-na-assipt/\n",
      "  02b-pequeno-informe/\n",
      "  02-strings-condicionais-repeticcoes-e-estruturas-de-dados/\n",
      "  03-estruturas-de-dados/\n",
      "16 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/git-e-github\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/pyodide\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/miniconda\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/exercicios-da-aula-04\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/04-aula-estruturas-de-dados-2-e-strings\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/python-no-android\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/05-aula\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/01-introducao-e-primeiros-passos\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/repositorio-do-curso\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/exercicios-da-aula-03\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/aula-02-exercicios\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/01-exercicios\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/python-na-assipt\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/02b-pequeno-informe\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/02-strings-condicionais-repeticcoes-e-estruturas-de-dados\n",
      "  index.md\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/posts/03-estruturas-de-dados\n",
      "  index.ipynb\n",
      "  index.html\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/2022\n",
      "  index.html\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/assets\n",
      "  xml/\n",
      "  css/\n",
      "  js/\n",
      "3 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/assets/xml\n",
      "  atom.xsl\n",
      "  rss.xsl\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/assets/css\n",
      "  all.css\n",
      "  all-nocdn.css\n",
      "  code.css\n",
      "  baguetteBox.min.css\n",
      "  nikola_rst.css\n",
      "  ipython.min.css\n",
      "  slidemenu.css\n",
      "  html4css1.css\n",
      "  nikola_ipython.css\n",
      "  rst.css\n",
      "  theme.css\n",
      "  rst_base.css\n",
      "0 diretório(s), 12 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/assets/js\n",
      "  jquery.min.js\n",
      "  baguetteBox.min.js\n",
      "  gallery.min.js\n",
      "  all-nocdn.js\n",
      "  gallery.js\n",
      "  justified-layout.min.js\n",
      "  jquery.js\n",
      "  fancydates.js\n",
      "  luxon.min.js\n",
      "  html5.js\n",
      "  menu.js\n",
      "  all.js\n",
      "  jquery.min.map\n",
      "  fancydates.min.js\n",
      "  html5shiv-printshiv.min.js\n",
      "0 diretório(s), 15 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/output/images\n",
      "  github-fork-marca.png\n",
      "  open-pull-request.png\n",
      "  pull-request-editado.png\n",
      "  pull-request.thumbnail.png\n",
      "  github-fork-marca.thumbnail.png\n",
      "  open-pull-request.thumbnail.png\n",
      "  criando-repositorio.png\n",
      "  criando-repositorio.thumbnail.png\n",
      "  merge-pull-request.png\n",
      "  pull-request.png\n",
      "  github-fork.png\n",
      "  pull-request-editado.thumbnail.png\n",
      "  merge-pull-request.thumbnail.png\n",
      "  github-fork.thumbnail.png\n",
      "0 diretório(s), 14 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/posts\n",
      "  aula-02-exercicios.meta\n",
      "  03-estruturas-de-dados.ipynb\n",
      "  exercicios-da-aula-03.meta\n",
      "  python-na-assipt.md\n",
      "  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.md\n",
      "  exercicios-da-aula-04.meta\n",
      "  repositorio-do-curso.md\n",
      "  04-aula-estruturas-de-dados-2-e-strings.ipynb\n",
      "  04-aula-estruturas-de-dados-2-e-strings.meta\n",
      "  git-e-github.md\n",
      "  03-estruturas-de-dados.meta\n",
      "  miniconda.md\n",
      "  pequeno-informe.md\n",
      "  01b-python-no-android.md\n",
      "  pyodide.md\n",
      "  exercicios-da-aula-03.ipynb\n",
      "  05-aula.ipynb\n",
      "  01-exercicios.ipynb\n",
      "  01-introducao-e-primeiros-passos.md\n",
      "  aula-02-exercicios.ipynb\n",
      "  exercicios-da-aula-04.ipynb\n",
      "  05-aula.meta\n",
      "  01-exercicios.meta\n",
      "0 diretório(s), 23 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/cache\n",
      "  posts/\n",
      "  jinja/\n",
      "2 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/cache/posts\n",
      "  01-introducao-e-primeiros-passos.html\n",
      "  git-e-github.html\n",
      "  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.html.dep\n",
      "  03-estruturas-de-dados.html\n",
      "  pequeno-informe.html.dep\n",
      "  miniconda.html\n",
      "  exercicios-da-aula-04.html\n",
      "  01-introducao-e-primeiros-passos.html.dep\n",
      "  python-na-assipt.html\n",
      "  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.html\n",
      "  pyodide.html.dep\n",
      "  01-exercicios.html\n",
      "  04-aula-estruturas-de-dados-2-e-strings.html\n",
      "  exercicios-da-aula-03.html\n",
      "  01-exercicios.html.dep\n",
      "  aula-02-exercicios.html\n",
      "  aula-02-exercicios.html.dep\n",
      "  repositorio-do-curso.html\n",
      "  04-aula-estruturas-de-dados-2-e-strings.html.dep\n",
      "  03-estruturas-de-dados.html.dep\n",
      "  05-aula.html.dep\n",
      "  exercicios-da-aula-03.html.dep\n",
      "  05-aula.html\n",
      "  01b-python-no-android.html.dep\n",
      "  git-e-github.html.dep\n",
      "  python-na-assipt.html.dep\n",
      "  exercicios-da-aula-04.html.dep\n",
      "  miniconda.html.dep\n",
      "  pequeno-informe.html\n",
      "  repositorio-do-curso.html.dep\n",
      "  01b-python-no-android.html\n",
      "  pyodide.html\n",
      "0 diretório(s), 32 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/cache/jinja\n",
      "  __jinja2_8d351f26171b8fd5a6689c93d901d85789aff5a8.cache\n",
      "  __jinja2_6a2b6e7ecdb42c2e2e5a5516dba5092a4f8b7434.cache\n",
      "  __jinja2_6631eee3c2dcc91fb44c6d6654646f263301897a.cache\n",
      "  __jinja2_c4685641804e5babb39f0a0ad6624e06785971ed.cache\n",
      "  __jinja2_8c999d72af0bc3e09ccdceccfa8cb0275684a53b.cache\n",
      "  __jinja2_6c945b31080e695bed0611c0d8e9521d35648df2.cache\n",
      "  __jinja2_ea1ff69dee73171938f8ff066f5d9dec55b8acc4.cache\n",
      "  __jinja2_abd3a24bc5b6e69c5f06485f7fe74f8ae15107e0.cache\n",
      "  __jinja2_f1bef3101ca29b18c9486e0e080ff216a0838205.cache\n",
      "  __jinja2_a156dc6897746d8302b35d24c87507625ea05f09.cache\n",
      "  __jinja2_667ee7a275b8efc17893f0a41914e61ebe71273a.cache\n",
      "  __jinja2_f0ce63e7d79466200026341d19cdf870ff9dc9bd.cache\n",
      "  __jinja2_ad7704eb3eb5e5f11613909cc55f3c1492210ff7.cache\n",
      "  __jinja2_235e3bf3b6e3e9b5aab607df3551010f963556fc.cache\n",
      "  __jinja2_fed6eba4800587fd6d8bb523b3e528c9aa475a5d.cache\n",
      "  __jinja2_a92336e7b26412ca88578112f38a5ba7adce3949.cache\n",
      "  __jinja2_01b23b4485e157ab7426073ca0074d46e90b9305.cache\n",
      "  __jinja2_96aa8edfca997a6339aabf48277c7ce3e14c9f6d.cache\n",
      "  __jinja2_f72fb4b711b3e052ba5e1b3bf3213fb3926c4918.cache\n",
      "  __jinja2_2890aefc350f3d56dbce495935e0d19ac6113144.cache\n",
      "0 diretório(s), 20 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes\n",
      "  slidemenu/\n",
      "1 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes/slidemenu\n",
      "  templates/\n",
      "  assets/\n",
      "  bundles\n",
      "  LICENSE\n",
      "  engine\n",
      "  README.md\n",
      "  parent\n",
      "  slidemenu.theme\n",
      "2 diretório(s), 6 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes/slidemenu/templates\n",
      "  base_helper.tmpl\n",
      "  base_header.tmpl\n",
      "0 diretório(s), 2 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets\n",
      "  css/\n",
      "  js/\n",
      "2 diretório(s), 0 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets/css\n",
      "  slidemenu.css\n",
      "0 diretório(s), 1 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets/js\n",
      "  jquery.min.js\n",
      "  jquery.js\n",
      "  menu.js\n",
      "  jquery.min.map\n",
      "0 diretório(s), 4 arquivo(s)\n",
      "\n",
      "Caminho: ../pagina-web/pythonassipt/images\n",
      "  github-fork-marca.png\n",
      "  open-pull-request.png\n",
      "  pull-request-editado.png\n",
      "  criando-repositorio.png\n",
      "  merge-pull-request.png\n",
      "  pull-request.png\n",
      "  github-fork.png\n",
      "0 diretório(s), 7 arquivo(s)\n"
     ]
    }
   ],
   "source": [
    "for raiz, diretorios, arquivos in os.walk(\"../pagina-web/\"):\n",
    "    print(\"\\nCaminho:\", raiz)\n",
    "    for d in diretorios:\n",
    "        print(f\"  {d}/\")\n",
    "    for f in arquivos:\n",
    "        print(f\"  {f}\")\n",
    "    print(f\"{len(diretorios)} diretório(s), {len(arquivos)} arquivo(s)\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "crazy-smell",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
