Aula 06: Arquivos (e funções...)
Aula 06: Arquivos¶
Não tenho como enfatizar a importância de saber armazenar dados em disco!
Aqui vamos ver os fundamentos de como trabalhar com arquivos.
Existem pacotes que permitem trabalhar com formatos de arquivos específicos:
-
Na biblioteca padrão do Python tem vários
- Bancos de dados:
sqlite3edbm - Arquivos comprimidos:
zlib,gzip,bz2,lzma,zipfile,tarfile -
json,html,xml csv- Outros
- Bancos de dados:
- Pacotes
- Tudo quanto é banco de dados
- Excel: pandas, openpyxl, xlrd. Ver também https://www.python-excel.org
- HDF5: https://docs.h5py.org/en/stable/
- Pandas tem um monte de coisa para diferentes formatos
- Figuras bitmap: Pillow
- Um monte de outras coisas...
Vamos tratar aqui dos fundamentos
Abrindo arquivos¶
Função open abre o arquivo:
f = open(nome_do_arquivo_string, modo)
Nome do arquivo deve ser uma string e a função open retorna um objeto do tipo file (arquivo em inglês).
Modo de abertura¶
| Modo | Operações |
|---|---|
| r | Leitura |
| w | Escrita - apaga o conteúdo que tiver |
| a | Escrita - preserva o conteúdo que tiver |
| b | Modo binário |
| + | Atualização (leitura e escrita) |
# Escrevendo um arquivo
arquivo = open("números.txt", "w")
for linha in range(1,101):
arquivo.write(f"{linha}\n")
arquivo.close()
# Lendo um arquivo
arquivo = open("números.txt", "r")
linhas = arquivo.readlines()
arquivo.close()
linhas
arquivo = open("números.txt", "r")
for linha in arquivo.readlines():
print(linha.strip())
arquivo.close()
# with
with open("números.txt", "r") as arquivo:
for linha in arquivo.readlines():
print(linha.strip())
# Ele já fecha automaticamente o arquivo mesmo se um erro ocorrer
Parâmetros da linha de comando¶
Ver o script linhadecomando.py
import sys
print(f"Número de parâmetros: {len(sys.argv)}")
for n, p in enumerate(sys.argv):
print(f"Parâmetro {n}: {p}")
Exercício 1¶
Escreva um programa que receba o nome de um arquivo pela linha de comando e imprimia todas as linhas desse aqruivo
Exercício 2¶
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)
Geração de arquivos¶
with open("ímpares.txt", "w") as ímpares:
with open("pares.txt", "w") as pares:
for n in range(1000):
if n % 2 == 0:
pares.write(f"{n}\n")
else:
ímpares.write(f"{n}\n")
with open("ímpares.txt", "w") as ímpares, open("pares.txt", "w") as pares:
for n in range(1000):
if n % 2 == 0:
pares.write(f"{n}\n")
else:
ímpares.write(f"{n}\n")
Leitura e escrita¶
É muito comum ler um arquivo e processá-lo e escrever em outro arquivo.
with open("multiplos_de_4.txt", "w") as múltiplos4, open("pares.txt", "r") as pares:
for l in pares.readlines():
if int(l) % 4 == 0:
múltiplos4.write(l)
Exercício 3¶
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
Exercício 4¶
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.
Geração de HTML¶
Uma das operações mais importantes da web!
with open("página.html", "w", encoding="utf-8") as página:
página.write('<!DOCTYPE html>\n')
página.write('<html lang="pt-br">\n')
página.write('<head>\n')
página.write('<meta charset="utf-8">\n')
página.write('<title>Título da página</title>\n')
página.write('</head>\n')
página.write('<body>\n')
página.write('Olá!\n')
for l in range(10):
página.write(f"<p>{l}</p>\n")
página.write('</body>\n')
página.write('</html>\n')
Algumas coisinhas importantes:
- argumento
encoding = "utf-8" - Usando
'e/ou"
Mas é chato ficar escrevendo esse monte de coisa. Lembra das aspas triplas que eu falei?
with open("página.html", "w", encoding="utf-8") as página:
página.write("""
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="utf-8">
<title>Título da página</title>
</head>
<body>
Olá!
""")
for l in range(10):
página.write(f"<p>{l}</p>\n")
página.write("""
</body>
</html>
""")
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.
filmes = {
"drama" : ["O Homem Elefante", "O Poderoso Chefão"],
"comédia" : ["Se beber não case", "O Auto da Compadecida", "American Pie"],
"policial" : ["Seven", "O silêncio dos inocentes", "Os Homens que não Amavam as Mulheres"],
"guerra" : ["Stalingrado", "O Resgate do Soldado Ryan", "Dunquerque"],
"ficção científica" : ["O Expresso do Amanhã", "Duna", "Guerra nas Estrelas", "A Ira de Kahn"]
}
with open("filmes.html", "w", encoding="utf-8") as página:
página.write("""
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="utf-8">
<title>Filmes</title>
</head>
<body>
""")
for c,v in filmes.items():
página.write(f"<h1>{c.capitalize()}</h1>\n")
for e in v:
página.write(f"<h2>{e}</h2>\n")
página.write("""
</body>
</html>
""")
Exercício 5¶
Modofique o programa anterior para utilizar o elemento p em vez de h2
Exercício 6¶
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:
<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>
Arquivos e diretórios¶
Sabe aqueles comandos que você usa na linha de comando? Dá para fazer o mesmo de dentro do Python.
import os
# Get current working directory (qual o diretório atual?)
os.getcwd()
# Criar diretórios: make directory (mkdir)
os.mkdir("a")
os.mkdir("b")
os.mkdir("c")
# Mudar o diretório atual: change directory (chdir)
os.chdir("a")
print(os.getcwd())
os.chdir("..")
print(os.getcwd())
os.chdir("b")
print(os.getcwd())
os.chdir("../c")
print(os.getcwd())
os.chdir("..")
# Apagar diretório **vazio**
os.rmdir("a")
os.rmdir("b")
os.rmdir("c")
# mkdir cria um diretório de cada vez. makedirs cria toda a árvore:
os.makedirs("a/b/c/d")
# Apagando os diretórios que estiverem vazios na árvore
os.removedirs("a/b/c/d")
# Mudando nomes de arquivos e diretórios
os.makedirs("avô/pai/filho")
os.rename("avô/pai", "avô/mãe")
# Dá também para listar os diretórios:
os.listdir(".")
os.listdir("avô")
Nomes de arquivos: os.path¶
import os.path # Funções que trabalham com nomes de arquivos
for a in os.listdir("."):
if os.path.isdir(a): # É uma pasta?
print(f"{a}/")
elif os.path.isfile(a):
print(a)
# Nome base
os.path.basename("06-Arquivos.ipynb")
# Dividir o nome em partes:
for s in os.path.split("/home/pjabardo/Documents/assipt/pythonassipt/06-aula/06-Arquivos.ipynb"):
print(s)
os.path.splitext("06-Arquivos.ipynb")
os.path.dirname("../05-aula/utilidades.py")
# Juntar os nomes:
os.path.join("home", "pjabardo", "Documents", "assipt")
Visitando todos os subdiretórios recursivamente¶
for raiz, diretorios, arquivos in os.walk("../pagina-web/"):
print("\nCaminho:", raiz)
for d in diretorios:
print(f" {d}/")
for f in arquivos:
print(f" {f}")
print(f"{len(diretorios)} diretório(s), {len(arquivos)} arquivo(s)")
Comentários
Comments powered by Disqus