{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "Zfq9gBDeGF6i" }, "source": [ "## MAC0209 - Modelagem e Simulação\n", "\n", "### Este notebook foi feito para quem sabe programar, mas ainda não sabe Python.\n", "\n", "### Divirta-se!\n" ] }, { "cell_type": "markdown", "metadata": { "id": "_vcLVuf8GF6p" }, "source": [ "## Strings\n", "\n", "Tipo de dados para representação de sequência de caracteres (texto)\n", "\n", "```python\n", "s = \"Uni. de São Paulo\"\n", "```\n", "\n", " 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n", " +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n", " | U | n | i | . | | d | e | | S | ã | o | | P | a | u | l | o |\n", " +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n", " -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1" ] }, { "cell_type": "markdown", "metadata": { "id": "7HNq4g7PGF6q" }, "source": [ "**Strings são parecidas com listas em vários aspectos e, por isso, muitas operações em _strings_ se assemelham a operações em listas:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 696, "status": "ok", "timestamp": 1617711130682, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "lgWWcW-bGF6q", "outputId": "e5540fc1-730b-4f22-815c-d0b4fd6bba80" }, "outputs": [], "source": [ "## Comprimento\n", "\n", "s = \"Uni. de São Paulo\"\n", "print( len(s) ) " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 670, "status": "ok", "timestamp": 1617711150667, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "1OVdHeNaGF6r", "outputId": "066fbc90-4c92-4b17-ed33-1c9f08807a26" }, "outputs": [], "source": [ "## Acesso a elementos\n", "\n", "print( s[-9], s[12] ) # acesso aos elementos de índices -9 e 12" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 487, "status": "ok", "timestamp": 1617711165762, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "v9BmdYb9GF6r", "outputId": "425786b9-8a8e-442e-ca10-01e1205b1eae" }, "outputs": [], "source": [ "## Fatiamento\n", "\n", "print( s[0:10] ) # fatia" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 486, "status": "ok", "timestamp": 1617711181410, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "WNCQwU-FGF6s", "outputId": "693db390-7964-48fb-ade4-3ec228fbc766" }, "outputs": [], "source": [ "## Percorre os elementos de uma string\n", "\n", "s = \"Texto\"\n", "for c in s: # percorre caracteres em string\n", " print(c, end = '.')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 461, "status": "ok", "timestamp": 1617711194723, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "u9WRItH5GF6s", "outputId": "d3872981-f5e1-4572-83fe-8e78cc8ac610" }, "outputs": [], "source": [ "## Verifica se um caractere pertence a uma string\n", "\n", "s = \"Texto\"\n", "if \"e\" in s: # verifica se um caractere ocorre em string\n", " print(\"Sim\")\n", "else:\n", " print(\"Não\")" ] }, { "cell_type": "markdown", "metadata": { "id": "MTnwmjFyGF6s" }, "source": [ "## Comparação de strings\n", "\n", "`s == r` é equivalente a\n", "\n", "```python\n", "def igual(s:str,r:str) -> bool:\n", " if len(s) != len(r):\n", " return False\n", " for i in range(len(s)):\n", " if s[i] != r[i]:\n", " return False\n", " return True\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 482, "status": "ok", "timestamp": 1617711205568, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "D24wYvm8GF6t", "outputId": "4ec5106b-bdec-4799-b35e-39fbcf69753f" }, "outputs": [], "source": [ "s = \"aeio\"\n", "r = \"abcd\"\n", "print( s != r )" ] }, { "cell_type": "markdown", "metadata": { "id": "qZT1aCZ4GF6t" }, "source": [ "## Strings são imutáveis\n", "\n", "A classe não tem o método append e nem é possível modificar um determinado elemento da string." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 186 }, "executionInfo": { "elapsed": 679, "status": "error", "timestamp": 1617711215876, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "kUcKBeZGGF6t", "outputId": "9389c74c-4aa9-4e07-b6a0-064d19a32d5f" }, "outputs": [], "source": [ "s = \"Outro texto\"\n", "#s[1] = \"A\"" ] }, { "cell_type": "markdown", "metadata": { "id": "RAHPXIM-GF6u" }, "source": [ "## Concatenação\n", "\n", "Embora não tenha `append` não funcione para strings, a classe permite a concatenação com o operador `+` para concatenar (juntar) duas strings." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 507, "status": "ok", "timestamp": 1617711226673, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "p-iHnnU_GF6u", "outputId": "839b71e7-2ecc-4aca-d684-bf4e34718989" }, "outputs": [], "source": [ "s1 = \"MAC\"\n", "s2 = \"0115\"\n", "s3 = s1 + s2 # s1 e s2 permancem inalteradas, uma nova string é criada\n", "print( s3 )" ] }, { "cell_type": "markdown", "metadata": { "id": "6tbcrL91GF6u" }, "source": [ "Em outras palavras, strings podem ser \"aumentadas\" através de concatenação:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 12908, "status": "ok", "timestamp": 1617711248832, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "rgeA3QypGF6v", "outputId": "8fa0ccd7-7b22-492d-c6ec-e0afd0d6b9cc" }, "outputs": [], "source": [ "vogais = \"\"\n", "vogal = \"\"\n", "while vogal != \"fim\": # operadores de comparação funcionam para strings\n", " vogal = str(input(\"Digite vogal ou 'fim': \"))\n", " if vogal != \"fim\":\n", " vogais = vogais + vogal\n", "print(vogais)" ] }, { "cell_type": "markdown", "metadata": { "id": "pfbXBfYwGF6v" }, "source": [ "## Problema para casa\n", "\n", "Escreva uma função que recebe uma string `texto` e uma string `sep` e\n", "retorna uma lista contendo as \"palavras\" do texto usando os caracteres `sep` como\n", "delimitadores das palavras.\n", "\n", "Exemplo: Para as entradas\n", "\n", "```python\n", "texto = \"Olá, mundo. Como é bom estudar MAC0115!\"\n", "sep = \" ,.\"\n", "```\n", "a função deve retornar\n", "```python\n", "['Olá', 'mundo', 'Como', 'é', 'bom', 'estudar', 'MAC0115!']\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 486, "status": "ok", "timestamp": 1617711318810, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "FgiEVhYVGF6v" }, "outputs": [], "source": [ "def separa(texto:str, sep:str) -> list:\n", " ''' Devolve lista de palavras em texto ''' \n", " lista = []\n", " ini = fim = 0\n", " while fim < len(texto):\n", " if texto[fim] in sep:\n", " if fim-ini > 0:\n", " lista.append(texto[ini:fim])\n", " ini = fim + 1\n", " fim = fim + 1\n", " if fim > ini: # lidar com última palavra\n", " lista.append(texto[ini:fim])\n", " return lista" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 440, "status": "ok", "timestamp": 1617711351234, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "Mjq_n7BFGF6v", "outputId": "9275b831-34f7-4f0e-905b-e0e14b9962fc" }, "outputs": [], "source": [ "# teste separa\n", "lista = separa(\"Olá, mundo! Como é bom estudar MAC0115, não é?\", \" ,.!?;:\")\n", "print(lista)" ] }, { "cell_type": "markdown", "metadata": { "id": "0tfKhSZ7GF6w" }, "source": [ "## Método `split`\n", "\n", "Gera uma lista de palavras de uma string\n", "\n", "## Da documentação do Python\n", "\n", "str.split(sep=None, maxsplit=-1)\n", "\n", " Return a list of the words in the string, using sep as the delimiter string. If maxsplit is given, at most maxsplit splits are done (thus, the list will have at most maxsplit+1 elements). If maxsplit is not specified or -1, then there is no limit on the number of splits (all possible splits are made).\n", " \n", " If sep is not specified or is None, a different splitting algorithm is applied: runs of consecutive whitespace are regarded as a single separator, and the result will contain no empty strings at the start or end if the string has leading or trailing whitespace. Consequently, splitting an empty string or a string consisting of just whitespace with a None separator returns [].\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 720, "status": "ok", "timestamp": 1617711360393, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "v2rLw1B5GF6w", "outputId": "49eb7690-f88e-4af6-a463-3191e9f98d68" }, "outputs": [], "source": [ "palavras = \"abacate, banana, maçã, pera e cenoura.\"\n", "lista = palavras.split()\n", "print(lista)" ] }, { "cell_type": "markdown", "metadata": { "id": "6M0UHamNGF6w" }, "source": [ "## Codificação\n", "\n", "Os caracteres no computador são representados por números inteiros. A codificação (encoding) de um arquivo é a lista de códigos usados para representar caracteres. A função `ord` devolve o código de uma letra." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 487, "status": "ok", "timestamp": 1617711388556, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "VJ8ULcA7GF6w", "outputId": "b24b2625-914d-443b-99e4-405aa9bc77c2" }, "outputs": [], "source": [ "for letra in \"ABCDEFRSTUVXYZ\":\n", " print( ord(letra), end = ' ' )\n", "print()\n", "\n", "for letra in \"abcdefrstuvxyz\":\n", " print( ord(letra), end = ' ' )\n", "print()\n", "\n", "for letra in \"aáàãâäå\":\n", " print( ord(letra), end = ' ' )" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 646, "status": "ok", "timestamp": 1617711396580, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "hlg5fqHQGF6x", "outputId": "da2a92cc-69ab-47ac-86fe-07d77b5c0fe1" }, "outputs": [], "source": [ "# E os números?\n", "\n", "for numero in \"0123456789\":\n", " print( ord(numero), end = ' ' )\n", "print()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 380, "status": "ok", "timestamp": 1617711399453, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "CLVkS18kGF6x", "outputId": "cf6c9317-d498-4a65-c21b-90ae1aa583b5" }, "outputs": [], "source": [ "# Codificação inclui caracteres não-imprímiveis: quebra de linha, fim de arquivo etc\n", "print( ord(\"\\n\") )\n", "print()\n", "print( ord(\"\\t\"))\n", "print()\n", "for simbolo in \"+-*/,.;:?\\<>\":\n", " print( ord(simbolo), end = ' ' )\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 596, "status": "ok", "timestamp": 1617711416198, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "k8iBEZB3GF6x", "outputId": "fd03796c-4b83-4acf-e5ad-b0eb973630f3" }, "outputs": [], "source": [ "# Relembrando como pulávamos linha no print\n", "print(\"Uma linha.\\nOutra linha.\\nMais uma linha.\")" ] }, { "cell_type": "markdown", "metadata": { "id": "6YVch7zYGF6x" }, "source": [ "## ASCii e UTF-8\n", "\n", "Existem várias codificações (*enconding*) de arquivos de texto. As mais comuns são\n", "- *ASCii*: que representa apenas letras do alfabeto latino sem acento, números e pontuações usando no máximo 8 bits\n", "\n", " https://en.wikipedia.org/wiki/ASCII\n", " \n", " \n", "- *UTF-8*: que representa letras do alfabeto latino e de outros alfabetos, incluindo acentos e diacríticos (p.ex., ç), números, pontuações e outros símbolos (flechas, operadores matemáticos etc), usando uma quantidade de bits variável.\n", " \n", " https://en.wikipedia.org/wiki/UTF-8\n", "\n", "O padrão nas versões recentes de Python é usar UTF-8." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 739, "status": "ok", "timestamp": 1617711438242, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "bx2fXPsrGF6y", "outputId": "dc88d79b-5e27-48ee-82fe-762d8fe43eaa" }, "outputs": [], "source": [ "for letra in \"Solução ± certa ≠ correta.\":\n", " print (ord(letra), end = ' ')" ] }, { "cell_type": "markdown", "metadata": { "id": "GBoXQHK2GF6y" }, "source": [ "## Função `chr`\n", "\n", "A função `chr` faz o inverso de `ord`, isto é, exibe o caractere de dado código ASCii, ou UTF-8" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 483, "status": "ok", "timestamp": 1617711459300, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "15KqNmwFGF6y", "outputId": "f212fed8-19b3-4456-84ac-5d26fce291b9" }, "outputs": [], "source": [ "# Codificação ASCii (usa 7 bits, 2^7=128 códigos)\n", "tamLinha = 8 # no. de caracteres por linha\n", "primeiro = 32 # primeiro símbolo imprímivel\n", "ultimo = 126 # último símbolo imprímivel\n", "for i in range(primeiro,ultimo+1):\n", " if (i-primeiro) % tamLinha == 0:\n", " print(f\"\\n[{i:3n}:{i+tamLinha:3n}] \", end='')\n", " print(f\"{chr(i):<3}\", end=' ')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 580, "status": "ok", "timestamp": 1617711489030, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "PrfaZeoXGF6y", "outputId": "4f57be6e-95e8-4f1d-f7a7-867277c37691" }, "outputs": [], "source": [ "# Tabela UTF-8\n", "tamLinha = 8 # no. de caracteres por linha\n", "primeiro = 193 # primeiro símbolo imprímivel \n", "ultimo = 256 # último símbolo imprímivel\n", "for i in range(primeiro,ultimo+1):\n", " if (i-primeiro) % tamLinha == 0:\n", " print(\"\\n[{:3n}:{:3n}] \".format(i,i+tamLinha), end='')\n", " print(\"{:<3}\".format(chr(i)), end=' ')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 523, "status": "ok", "timestamp": 1617712293958, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "IuBANICYGF6z", "outputId": "e8585618-9b88-43ec-fce1-52b2d26e0837" }, "outputs": [], "source": [ "# Tabela UTF-8\n", "tamLinha = 8 # no. de caracteres por linha\n", "primeiro = 20254 # primeiro símbolo imprímivel\n", "ultimo = 20293 # último símbolo imprímivel\n", "for i in range(primeiro,ultimo+1):\n", " if (i-primeiro) % tamLinha == 0:\n", " print(\"\\n[{:3n}:{:3n}] \".format(i,i+tamLinha), end='')\n", " print(f\"{chr(i):<3}\", end=' ')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 641, "status": "ok", "timestamp": 1617712327306, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "CFbDQkNyGF6z", "outputId": "87fe9b9a-4ab3-43d0-b2a8-575ffd11c2ad" }, "outputs": [], "source": [ "tamLinha = 5 # no. de caracteres por linha\n", "primeiro = 9312 # primeiro símbolo imprímivel\n", "ultimo = 9331 # último símbolo imprímivel\n", "for i in range(primeiro,ultimo+1):\n", " if (i-primeiro) % tamLinha == 0:\n", " print(f\"\\n[{i:3n}:{i+tamLinha:3n}] \", end='')\n", " print(f\"{chr(i):<3}\", end=' ')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 487, "status": "ok", "timestamp": 1617712328851, "user": { "displayName": "Artur André Almeida de Macedo Oliveira", "photoUrl": "", "userId": "03596783672353073020" }, "user_tz": 180 }, "id": "qKyh5H-RGF6z", "outputId": "bf0df991-498a-4bb0-a23a-1863c3d722ec" }, "outputs": [], "source": [ "tamLinha = 15 # no. de caracteres por linha\n", "primeiro = 9472 # primeiro símbolo imprímivel\n", "ultimo = 9636 # último símbolo imprímivel\n", "for i in range(primeiro,ultimo+1):\n", " if (i-primeiro) % tamLinha == 0:\n", " print(f\"\\n[{i:3n}:{i+tamLinha:3n}] \", end='')\n", " print(f\"{chr(i):<3}\", end=' ')" ] }, { "cell_type": "markdown", "metadata": { "id": "eWwB9gPkGF6z" }, "source": [ "### Sistema de arquivos \n", "\n", "- Arquivos são organizados no computador em uma **estrutura hierárquica de pastas** ou diretórios\n", "- Para abrir um arquivo deve-se passar o endereço exato (caminho) dentro dessa estrutura\n", " - `C:\\Usuários\\\\Meus Documentos\\`\n", " - `/Users//Documents/`\n", " - `/home//Documents/`\n", "- **Se omitimos a estrutura de pastas o interpretador Python assume que nos referimos a um arquivo na mesma pasta de onde o programa está sendo executado.**" ] }, { "cell_type": "markdown", "metadata": { "id": "0P4g2T7NGF60" }, "source": [ "Para criar um objeto do tipo file de nome `arquivo` referenciando um arquivo de nome 'arquivo.txt' com permissão de **leitura** (mas não de escrita), usamos:\n", "\n", "```python\n", "with open('arquivo.txt', 'r') as arquivo:\n", " # manipular arquivo em modo leitura\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "LBtror0TGF61" }, "source": [ "ou o equivalente:\n", "\n", "```python\n", "with open('arquivo.txt') as arquivo:\n", " # manipular arquivo em modo leitura\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "vVtkqThQGF61" }, "source": [ "Para criar um objeto do tipo file de nome `arquivo` referenciando um arquivo de nome 'arquivo.txt' com permissão de **escrita** (mas não de leitura), usamos:\n", "\n", "```python\n", "with open('arquivo.txt', 'w') as arquivo:\n", " # manipular arquivo em modo escrita\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "B-Nhj9-AGF61" }, "source": [ "Para criar um objeto do tipo file de nome `arquivo` referenciando um arquivo de nome 'arquivo.txt' com permissão de **leitura e escrita**, usamos:\n", "\n", "Caso o arquivo já exista:\n", "```python\n", "with open('arquivo.txt', 'r+') as arquivo:\n", " # manipular arquivo\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "vibtDNZ3GF61" }, "source": [ "Acesso a arquivo se encerra ao terminar bloco `with ...`:\n", "```python\n", "with open('arquivo.txt', 'r+') as arquivo:\n", " # escrita/leitura de arquivo\n", "# acesso a arquivo é encerrado\n", "# tentativa de acessar arquivo resulta em erro\n", "```" ] }, { "cell_type": "markdown", "metadata": { "id": "udkXNuKqGF62" }, "source": [ "## Função `read`\n", "\n", "Lê todo o conteúdo de um arquivo de texto (incluindo quebras de linha) e o devolve em uma _string_" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "bMAuOlbsGF62", "scrolled": true }, "outputs": [], "source": [ "with open('testes.txt') as arquivo:\n", " texto = arquivo.read() \n", "#texto = arquivo.read() # descomentar gera erro de acesso\n", "texto = texto.lower() # não usa arquivo\n", "print(texto) \n", "texto = texto.upper() # não usa arquivo\n", "print(texto) # não usa arquivo" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "1_q-SE3nGF63" }, "outputs": [], "source": [ "with open('testes.txt') as arquivo:\n", " texto = arquivo.read() \n", "\n", "palavras = texto.split()\n", "print(palavras)" ] }, { "cell_type": "markdown", "metadata": { "id": "1WFfGC_wGF63" }, "source": [ "## Arquivos e codificação\n", "\n", "Para abrir um arquivo usando uma determinada codificação, use o argumento `encoding`.\n", "\n", "```python\n", "with open(nome, encoding='utf-8') as arquivo: # padrão é utf-8\n", " # escrita/leitura de arquivo\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "KPDlycSTGF63" }, "outputs": [], "source": [ "with open('testes.txt', encoding = 'utf-8') as arquivo: # trocar encoding por ascii produz erro;\n", " texto = arquivo.read() # trocar por latin1 gera caracteres errados\n", "print(texto)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "vOSVwgfoGF63" }, "outputs": [], "source": [ "with open('testes.txt', encoding = 'ascii') as arquivo: # trocar encoding por ascii produz erro;\n", " texto = arquivo.read() # trocar por latin1 gera caracteres errados\n", "print(texto)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "rnwhoX7EGF64" }, "outputs": [], "source": [ "with open('testes.txt', encoding = 'latin1') as arquivo: # trocar encoding por ascii produz erro;\n", " texto = arquivo.read() # trocar por latin1 gera caracteres errados\n", "print(texto)" ] }, { "cell_type": "markdown", "metadata": { "id": "VoPxAeg7GF64" }, "source": [ "## Problema: Leitura linha a linha\n", "\n", "Escreva um programa que lê um nome de arquivo do usuário e exibe as linhas do arquivo correspondente, numerando-as.\n", "Por exemplo:\n", "\n", "```python\n", "1. ele tinha a faca e o queijo\n", "2. na mão,\n", "3. mas preferiu a goiabada\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "E_dVk3GLGF64" }, "outputs": [], "source": [ "arqnome = input(\"Arquivo: \") # \"No meio do caminho.txt\"\n", "print()\n", "with open(arqnome) as arq:\n", " texto = arq.read() # li conteúdo do arquivo e guardei na variável texto\n", "linhas = texto.split('\\n')\n", "for i in range(len(linhas)):\n", " print(f'{i+1}. {linhas[i]}')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_-2oRzIsGF64" }, "outputs": [], "source": [ "# Substituir por código UTF-8 começando em 9312\n", "arqnome = input(\"Arquivo: \") # \"No meio do caminho.txt\"\n", "print()\n", "with open(arqnome) as arquivo:\n", " texto = arquivo.read()\n", "linhas = texto.split('\\n')\n", "for i in range(len(linhas)):\n", " print(f'{chr(i+9312)} {linhas[i]}')" ] }, { "cell_type": "markdown", "metadata": { "id": "tGKR8lZ3GF64" }, "source": [ "## Leitura linha a linha\n", "\n", "Podemos percorrer as linhas de um arquivo de modo texto usando\n", "\n", "```python\n", "for linha in arquivo:\n", "```\n", "\n", "A cada iteração, `linha` recebe uma string contendo uma linha do arquivo, incluindo a quebra de linha\n", "\n", "**Atenção**: Uma `linha` de um arquivo é definida como uma sequência de caracteres delimitadas pelo símbolo de quebra de linha (que representamos por `\"\\n\"`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JRZxZfIFGF65" }, "outputs": [], "source": [ "arqnome = input(\"Arquivo: \")\n", "print()\n", "with open(arqnome) as arquivo:\n", " # ler arquivo uma linha por vez\n", " for linha in arquivo:\n", " print(linha)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OheSj9gDGF65" }, "outputs": [], "source": [ "# Solução se toda linha contiver quebra de linha\n", "arqnome = input(\"Arquivo: \")\n", "print()\n", "with open(arqnome, 'r') as arquivo: # \"abre\" arquivo para leitura\n", " for linha in arquivo:\n", " print (linha, end = '') # linha já contém caractere de quebra de linha" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "tgWVleF7GF65" }, "outputs": [], "source": [ "# Forma alternativa de lidar com quebra de linha (quando última linha não contém quebra)\n", "arqnome = input(\"Arquivo: \")\n", "print()\n", "with open(arqnome, 'r') as arquivo: # \"abre\" arquivo para leitura\n", " for linha in arquivo:\n", " if linha[-1] == \"\\n\": # se último caractere da string for quebra de linha\n", " linha = linha[:-1] # \"remova\" último caractere (fatia do primeiro ao penúltimo caractere)\n", " print(linha)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "YVA5wOJpGF65" }, "outputs": [], "source": [ "## Problema anterior revisto - Leitura linha a linha\n", "\n", "arqnome = input(\"Arquivo: \") # \"No meio do caminho.txt\"\n", "print()\n", "with open(arqnome) as arquivo:\n", " i = 1\n", " for linha in arquivo:\n", " print(f\"{i}. {linha}\", end = '')\n", " i = i +1" ] }, { "cell_type": "markdown", "metadata": { "id": "U4N2tFM2GF65" }, "source": [ "## Problema para casa: Palavras mais frequente\n", "\n", "Escreva um programa que encontra a palavra mais frequente no texto, ou seja, a que ocorre mais vezes.\n", "Para ser mais interessante, considere apenas palavras com ao menos 4 letras.\n", "\n", "_Dica:_ Pense no problema de computar o número de ocorrência de uma lista de reais" ] } ], "metadata": { "celltoolbar": "Slideshow", "colab": { "collapsed_sections": [ "U4N2tFM2GF65" ], "name": "MAC0209-PythonForDummies-Part2.ipynb", "provenance": [] }, "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.5" }, "rise": { "enable_chalkboard": true, "scroll": true }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }