{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Respostas dos exerc\u00edcios II\n",
"=============================\n",
"_____________________________\n",
"\n",
"1\\. Implementar um programa que receba um nome de arquivo e gere estat\u00edsticas sobre o arquivo (n\u00famero de caracteres, n\u00famero de linhas e n\u00famero de palavras)\n",
"\n",
"Solu\u00e7\u00e3o 1:\n",
"\n",
"(Economizando mem\u00f3ria)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filename = raw_input('Nome do arquivo: ')\n",
"in_file = file(filename)\n",
"\n",
"c, w, l = 0, 0, 0\n",
"\n",
"# Para cada linha do arquivo\n",
"for line in in_file:\n",
"\n",
" # Soma 1 ao n\u00famero de linhas\n",
" l += 1\n",
"\n",
" # Soma o tamanho da linha ao n\u00famero de caracteres\n",
" c += len(line)\n",
"\n",
" # Soma a quantidade de palavra\n",
" w += len(line.split())\n",
"\n",
"in_file.close()\n",
"\n",
"print 'Bytes: %d, palavras: %d, linhas: %s' % (c, w, l)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Solu\u00e7\u00e3o 2:\n",
"\n",
"(Economizando c\u00f3digo)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"filename = raw_input('Nome do arquivo: ')\n",
"\n",
"# L\u00ea o arquivo inteiro para uma string\n",
"chars = file(filename).read()\n",
"\n",
"c = len(chars)\n",
"w = len(chars.split())\n",
"\n",
"# Soma o n\u00famero de caracteres de nova linha\n",
"l = chars.count('\\n')\n",
"\n",
"print 'Bytes: %d, palavras: %d, linhas: %s' % (c, w, l)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"2\\. Implementar um m\u00f3dulo com duas fun\u00e7\u00f5es:\n",
"\n",
"+ `matrix_sum(*matrices)`, que retorna a matriz soma de matrizes de duas dimens\u00f5es.\n",
"+ `camel_case(s)`, que converte nomes para CamelCase.\n",
"\n",
"Solu\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def matrix_sum(*matrices):\n",
" \"\"\"\n",
" Soma matrizes de duas dimens\u00f5es.\n",
" \"\"\"\n",
" # Pegue a primeira matriz\n",
" mat = matrices[0]\n",
"\n",
" # Para cada matriz da segunda em diante\n",
" for matrix in matrices[1:]:\n",
"\n",
" # Para cada linha da matriz\n",
" for x, row in enumerate(matrix):\n",
"\n",
" # Para cada elemento da linha\n",
" for y, col in enumerate(row):\n",
"\n",
" # Some na matriz de resposta\n",
" mat[x][y] += col\n",
"\n",
" return mat\n",
"\n",
"def camel_case(s):\n",
" \"\"\"\n",
" Formata strings DestaForma.\n",
" \"\"\"\n",
" return ''.join(s.title().split())\n",
"\n",
"if __name__ == '__main__':\n",
"\n",
" # Testes\n",
" print matrix_sum([[1, 2], [3, 4]], [[5, 6], [7, 8]])\n",
" print camel_case('close to the edge')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[6, 8], [10, 12]]\n",
"CloseToTheEdge\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"3\\. Implementar uma fun\u00e7\u00e3o que leia um arquivo e retorne uma lista de tuplas com os dados (o separador de campo do arquivo \u00e9 v\u00edrgula), eliminando as linhas vazias. Caso ocorra algum problema, imprima uma mensagem de aviso e encerre o programa.\n",
"\n",
"*Script* para gerar os dados de teste:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Importa o m\u00f3dulo para gerar\n",
"# n\u00fameros rand\u00f4micos\n",
"import random\n",
"\n",
"# Abre o arquivo\n",
"csv = file('test.csv', 'w')\n",
"\n",
"for i in xrange(100):\n",
" r = []\n",
"\n",
" for i in xrange(10):\n",
" # random.randrange() escolhe n\u00fameros\n",
" # dentro de um intervalo. A sintaxe\n",
" # \u00e9 a mesma da fun\u00e7\u00e3o range()\n",
" r.append('%04d' %random.randrange(1000))\n",
"\n",
" csv.write(','.join(r) + '\\n')\n",
"\n",
"# Fecha o arquivo\n",
"csv.close()"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Solu\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def load_csv(fn):\n",
"\n",
" try:\n",
"\n",
" # L\u00ea todas as linhas do arquivo\n",
" lines = file(fn).readlines()\n",
" new_lines = []\n",
"\n",
" for line in lines:\n",
" new_line = line.strip()\n",
"\n",
" # Se houver caracteres na linha\n",
" if new_line:\n",
"\n",
" # Quebra nas v\u00edrgulas, converte para tupla e\n",
" # acrescenta na sa\u00edda\n",
" new_lines.append(tuple(new_line.split(',')))\n",
"\n",
" return new_lines\n",
"\n",
" # Tratamento de exce\u00e7\u00e3o\n",
" except:\n",
"\n",
" print 'Ocorreu um erro ao ler o arquivo', fn\n",
" raise SystemExit"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"4\\. Implementar um m\u00f3dulo com duas fun\u00e7\u00f5es:\n",
"\n",
"+ `split(fn, n)`, que quebra o arquivo fn em partes de n bytes e salva com nomes sequenciais (se fn = arq.txt, ent\u00e3o arq_001.txt, arq_002.txt, ... )\n",
"+ `join(fn, fnlist)` que junte os arquivos da lista fnlist em um arquivo s\u00f3 fn.\n",
"\n",
"Solu\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"\"\"\n",
"breaker.py\n",
"\"\"\"\n",
"\n",
"# Quebra o arquivo em fatias de n bytes\n",
"def split(fn, n):\n",
"\n",
" bytes = list(file(fn, 'rb').read())\n",
" name, ext = fn.split('.')\n",
" num = 1\n",
"\n",
" while bytes:\n",
" out = ''.join(bytes[:n])\n",
" del bytes[:n]\n",
" newfn = '%s_%3d.%s' % (name, num, ext)\n",
" file(newfn, 'wb').write(out)\n",
" num += 1\n",
"\n",
"# Junta as fatias em um arquivo\n",
"def join(fn, fnlist):\n",
"\n",
" out = ''\n",
" for f in fnlist:\n",
" out += file(f, 'rb').read()\n",
" file(fn, 'wb').write(out)\n",
"\n",
"if __name__ == '__main__':\n",
" # Teste\n",
" import glob\n",
"\n",
" split('breaker.py', 20)\n",
" join('breaker2.py', sorted(glob.glob('breaker_*.py')))"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"5\\. Crie um *script* que:\n",
"\n",
"+ Compare a lista de arquivos em duas pastas distintas.\n",
"+ Mostre os nomes dos arquivos que tem conte\u00fados diferentes e/ou que existem em apenas uma das pastas.\n",
"\n",
"Solu\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import os\n",
"\n",
"# Nomes das pastas\n",
"pst1 = 'teste1'\n",
"pst2 = 'teste2'\n",
"\n",
"# Lista o conte\u00fado das pastas\n",
"lst1 = os.listdir(pst1)\n",
"lst2 = os.listdir(pst2)\n",
"\n",
"for fl in lst1:\n",
" \n",
" if fl in lst2:\n",
"\n",
" # L\u00ea os arquivos e compara:\n",
" if file(os.path.join(pst1, fl)).read() <> \\\n",
" file(os.path.join(pst2, fl)).read():\n",
" print fl, 'diferente'\n",
"\n",
" # O arquivo n\u00e3o est\u00e1 na segunda pasta\n",
" else:\n",
" print fl, 'apenas em', pst1\n",
"\n",
"for fl in lst2:\n",
" # O arquivo n\u00e3o est\u00e1 na primeira pasta\n",
" if not fl in lst1:\n",
" print fl, 'apenas em', pst2"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"6\\. Fa\u00e7a um *script* que:\n",
"\n",
"+ Leia um arquivo texto.\n",
"+ Conte as ocorr\u00eancias de cada palavra.\n",
"+ Mostre os resultados ordenados pelo n\u00famero de ocorr\u00eancias.\n",
"\n",
"Solu\u00e7\u00e3o:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import string\n",
"\n",
"# L\u00ea o arquivo\n",
"texto = file('note.txt').read()\n",
"texto_limpo = ''\n",
"\n",
"# Limpa o texto\n",
"for car in texto:\n",
" if not car in string.punctuation:\n",
" texto_limpo += car\n",
"\n",
"# Separa as palavras\n",
"palavras = texto_limpo.split()\n",
"\n",
"# Conta\n",
"resp = {}\n",
"for palavra in palavras:\n",
" resp[palavra] = resp.get(palavra, 0) + 1\n",
"saida = resp.items()\n",
"\n",
"# Ordena\n",
"def cmp(x, y):\n",
" return x[-1] - y[-1]\n",
"saida.sort(cmp=cmp, reverse=True)\n",
"\n",
"# Imprime\n",
"for k, v in saida:\n",
" print k, '=>', v"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}