Pular para o conteúdo principal

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:

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)
In [1]:
# Escrevendo um arquivo
arquivo = open("números.txt", "w")
for linha in range(1,101):
    arquivo.write(f"{linha}\n")
arquivo.close()
In [2]:
# Lendo um arquivo
arquivo = open("números.txt", "r")
linhas = arquivo.readlines()
arquivo.close()
In [3]:
linhas
Out[3]:
['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']
In [4]:
arquivo = open("números.txt", "r")
for linha in arquivo.readlines():
    print(linha.strip())
arquivo.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
In [5]:
# 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

Parâmetros da linha de comando

Ver o script linhadecomando.py

In [6]:
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}")
Número de parâmetros: 3
Parâmetro 0: /usr/lib/python3.10/site-packages/ipykernel_launcher.py
Parâmetro 1: -f
Parâmetro 2: /home/pjabardo/.local/share/jupyter/runtime/kernel-6d6d8ced-60a0-42b2-816b-ea3bbf91c07a.json

Exercício 1

Escreva um programa que receba o nome de um arquivo pela linha de comando e imprimia todas as linhas desse aqruivo

In [ ]:
 

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)

In [ ]:
 

Geração de arquivos

In [7]:
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")
                
In [8]:
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.

In [9]:
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

In [ ]:
 

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.

In [ ]:
 

Geração de HTML

Uma das operações mais importantes da web!

In [10]:
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?

In [11]:
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.

In [12]:
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"]
}
In [13]:
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

In [ ]:
 

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.

In [14]:
import os
In [15]:
# Get current working directory (qual o diretório atual?)
os.getcwd() 
Out[15]:
'/home/pjabardo/Documents/assipt/pythonassipt/work'
In [16]:
# Criar diretórios: make directory (mkdir)
os.mkdir("a")
os.mkdir("b")
os.mkdir("c")
In [17]:
# Mudar o diretório atual: change directory (chdir)
os.chdir("a")
print(os.getcwd())
/home/pjabardo/Documents/assipt/pythonassipt/work/a
In [18]:
os.chdir("..")
print(os.getcwd())
/home/pjabardo/Documents/assipt/pythonassipt/work
In [19]:
os.chdir("b")
print(os.getcwd())
/home/pjabardo/Documents/assipt/pythonassipt/work/b
In [20]:
os.chdir("../c")
print(os.getcwd())
os.chdir("..")
/home/pjabardo/Documents/assipt/pythonassipt/work/c
In [21]:
# Apagar diretório **vazio**
os.rmdir("a")
os.rmdir("b")
os.rmdir("c")
In [22]:
# mkdir cria um diretório de cada vez. makedirs cria toda a árvore:
os.makedirs("a/b/c/d")
In [23]:
# Apagando os diretórios que estiverem vazios na árvore
os.removedirs("a/b/c/d")
In [24]:
# Mudando nomes de arquivos e diretórios
os.makedirs("avô/pai/filho")
In [25]:
os.rename("avô/pai", "avô/mãe")
In [26]:
# Dá também para listar os diretórios:
os.listdir(".")
Out[26]:
['06-funcoes.ipynb',
 'pares.txt',
 'linhadecomando.py',
 '.ipynb_checkpoints',
 'filmes.html',
 'ímpares.txt',
 'página.html',
 'ola.html',
 'números.txt',
 '06-Arquivos.ipynb',
 'multiplos_de_4.txt',
 'avô']
In [27]:
os.listdir("avô")
Out[27]:
['mãe']

Nomes de arquivos: os.path

In [28]:
import os.path  # Funções que trabalham com nomes de arquivos
In [30]:
for a in os.listdir("."):
    if os.path.isdir(a):  # É uma pasta?
        print(f"{a}/")
    elif os.path.isfile(a):
        print(a)
        
06-funcoes.ipynb
pares.txt
linhadecomando.py
.ipynb_checkpoints/
filmes.html
ímpares.txt
página.html
ola.html
números.txt
06-Arquivos.ipynb
multiplos_de_4.txt
avô/
In [31]:
# Nome base
os.path.basename("06-Arquivos.ipynb")
Out[31]:
'06-Arquivos.ipynb'
In [32]:
# Dividir o nome em partes:
for s in os.path.split("/home/pjabardo/Documents/assipt/pythonassipt/06-aula/06-Arquivos.ipynb"):
    print(s)
    
/home/pjabardo/Documents/assipt/pythonassipt/06-aula
06-Arquivos.ipynb
In [34]:
os.path.splitext("06-Arquivos.ipynb")
Out[34]:
('06-Arquivos', '.ipynb')
In [35]:
os.path.dirname("../05-aula/utilidades.py")
Out[35]:
'../05-aula'
In [36]:
# Juntar os nomes:

os.path.join("home", "pjabardo", "Documents", "assipt")
Out[36]:
'home/pjabardo/Documents/assipt'

Visitando todos os subdiretórios recursivamente

In [37]:
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)")
Caminho: ../pagina-web/
  pythonassipt/
1 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt
  __pycache__/
  output/
  posts/
  cache/
  themes/
  images/
  .doit.db
  conf.py
6 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/__pycache__
  conf.cpython-310.pyc
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output
  categories/
  posts/
  2022/
  assets/
  images/
  index-1.html
  sitemapindex.xml
  sitemap.xml
  robots.txt
  index.html
  archive.html
  rss.xml
5 diretório(s), 7 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories
  assipt/
  git/
  programacao/
  introducao/
  spyder/
  github/
  instalacao/
  python/
  controle-de-versao/
  git.xml
  spyder.xml
  introducao.xml
  assipt.xml
  controle-de-versao.xml
  programacao.xml
  index.html
  python.xml
  github.xml
  instalacao.xml
9 diretório(s), 10 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/assipt
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/git
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/programacao
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/introducao
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/spyder
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/github
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/instalacao
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/python
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/categories/controle-de-versao
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts
  git-e-github/
  pyodide/
  miniconda/
  exercicios-da-aula-04/
  04-aula-estruturas-de-dados-2-e-strings/
  python-no-android/
  05-aula/
  01-introducao-e-primeiros-passos/
  repositorio-do-curso/
  exercicios-da-aula-03/
  aula-02-exercicios/
  01-exercicios/
  python-na-assipt/
  02b-pequeno-informe/
  02-strings-condicionais-repeticcoes-e-estruturas-de-dados/
  03-estruturas-de-dados/
16 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/git-e-github
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/pyodide
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/miniconda
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/exercicios-da-aula-04
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/04-aula-estruturas-de-dados-2-e-strings
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/python-no-android
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/05-aula
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/01-introducao-e-primeiros-passos
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/repositorio-do-curso
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/exercicios-da-aula-03
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/aula-02-exercicios
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/01-exercicios
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/python-na-assipt
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/02b-pequeno-informe
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/02-strings-condicionais-repeticcoes-e-estruturas-de-dados
  index.md
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/posts/03-estruturas-de-dados
  index.ipynb
  index.html
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/2022
  index.html
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/assets
  xml/
  css/
  js/
3 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/assets/xml
  atom.xsl
  rss.xsl
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/assets/css
  all.css
  all-nocdn.css
  code.css
  baguetteBox.min.css
  nikola_rst.css
  ipython.min.css
  slidemenu.css
  html4css1.css
  nikola_ipython.css
  rst.css
  theme.css
  rst_base.css
0 diretório(s), 12 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/assets/js
  jquery.min.js
  baguetteBox.min.js
  gallery.min.js
  all-nocdn.js
  gallery.js
  justified-layout.min.js
  jquery.js
  fancydates.js
  luxon.min.js
  html5.js
  menu.js
  all.js
  jquery.min.map
  fancydates.min.js
  html5shiv-printshiv.min.js
0 diretório(s), 15 arquivo(s)

Caminho: ../pagina-web/pythonassipt/output/images
  github-fork-marca.png
  open-pull-request.png
  pull-request-editado.png
  pull-request.thumbnail.png
  github-fork-marca.thumbnail.png
  open-pull-request.thumbnail.png
  criando-repositorio.png
  criando-repositorio.thumbnail.png
  merge-pull-request.png
  pull-request.png
  github-fork.png
  pull-request-editado.thumbnail.png
  merge-pull-request.thumbnail.png
  github-fork.thumbnail.png
0 diretório(s), 14 arquivo(s)

Caminho: ../pagina-web/pythonassipt/posts
  aula-02-exercicios.meta
  03-estruturas-de-dados.ipynb
  exercicios-da-aula-03.meta
  python-na-assipt.md
  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.md
  exercicios-da-aula-04.meta
  repositorio-do-curso.md
  04-aula-estruturas-de-dados-2-e-strings.ipynb
  04-aula-estruturas-de-dados-2-e-strings.meta
  git-e-github.md
  03-estruturas-de-dados.meta
  miniconda.md
  pequeno-informe.md
  01b-python-no-android.md
  pyodide.md
  exercicios-da-aula-03.ipynb
  05-aula.ipynb
  01-exercicios.ipynb
  01-introducao-e-primeiros-passos.md
  aula-02-exercicios.ipynb
  exercicios-da-aula-04.ipynb
  05-aula.meta
  01-exercicios.meta
0 diretório(s), 23 arquivo(s)

Caminho: ../pagina-web/pythonassipt/cache
  posts/
  jinja/
2 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt/cache/posts
  01-introducao-e-primeiros-passos.html
  git-e-github.html
  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.html.dep
  03-estruturas-de-dados.html
  pequeno-informe.html.dep
  miniconda.html
  exercicios-da-aula-04.html
  01-introducao-e-primeiros-passos.html.dep
  python-na-assipt.html
  02-strings-condicionais-repeticcoes-e-estruturas-de-dados.html
  pyodide.html.dep
  01-exercicios.html
  04-aula-estruturas-de-dados-2-e-strings.html
  exercicios-da-aula-03.html
  01-exercicios.html.dep
  aula-02-exercicios.html
  aula-02-exercicios.html.dep
  repositorio-do-curso.html
  04-aula-estruturas-de-dados-2-e-strings.html.dep
  03-estruturas-de-dados.html.dep
  05-aula.html.dep
  exercicios-da-aula-03.html.dep
  05-aula.html
  01b-python-no-android.html.dep
  git-e-github.html.dep
  python-na-assipt.html.dep
  exercicios-da-aula-04.html.dep
  miniconda.html.dep
  pequeno-informe.html
  repositorio-do-curso.html.dep
  01b-python-no-android.html
  pyodide.html
0 diretório(s), 32 arquivo(s)

Caminho: ../pagina-web/pythonassipt/cache/jinja
  __jinja2_8d351f26171b8fd5a6689c93d901d85789aff5a8.cache
  __jinja2_6a2b6e7ecdb42c2e2e5a5516dba5092a4f8b7434.cache
  __jinja2_6631eee3c2dcc91fb44c6d6654646f263301897a.cache
  __jinja2_c4685641804e5babb39f0a0ad6624e06785971ed.cache
  __jinja2_8c999d72af0bc3e09ccdceccfa8cb0275684a53b.cache
  __jinja2_6c945b31080e695bed0611c0d8e9521d35648df2.cache
  __jinja2_ea1ff69dee73171938f8ff066f5d9dec55b8acc4.cache
  __jinja2_abd3a24bc5b6e69c5f06485f7fe74f8ae15107e0.cache
  __jinja2_f1bef3101ca29b18c9486e0e080ff216a0838205.cache
  __jinja2_a156dc6897746d8302b35d24c87507625ea05f09.cache
  __jinja2_667ee7a275b8efc17893f0a41914e61ebe71273a.cache
  __jinja2_f0ce63e7d79466200026341d19cdf870ff9dc9bd.cache
  __jinja2_ad7704eb3eb5e5f11613909cc55f3c1492210ff7.cache
  __jinja2_235e3bf3b6e3e9b5aab607df3551010f963556fc.cache
  __jinja2_fed6eba4800587fd6d8bb523b3e528c9aa475a5d.cache
  __jinja2_a92336e7b26412ca88578112f38a5ba7adce3949.cache
  __jinja2_01b23b4485e157ab7426073ca0074d46e90b9305.cache
  __jinja2_96aa8edfca997a6339aabf48277c7ce3e14c9f6d.cache
  __jinja2_f72fb4b711b3e052ba5e1b3bf3213fb3926c4918.cache
  __jinja2_2890aefc350f3d56dbce495935e0d19ac6113144.cache
0 diretório(s), 20 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes
  slidemenu/
1 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes/slidemenu
  templates/
  assets/
  bundles
  LICENSE
  engine
  README.md
  parent
  slidemenu.theme
2 diretório(s), 6 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes/slidemenu/templates
  base_helper.tmpl
  base_header.tmpl
0 diretório(s), 2 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets
  css/
  js/
2 diretório(s), 0 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets/css
  slidemenu.css
0 diretório(s), 1 arquivo(s)

Caminho: ../pagina-web/pythonassipt/themes/slidemenu/assets/js
  jquery.min.js
  jquery.js
  menu.js
  jquery.min.map
0 diretório(s), 4 arquivo(s)

Caminho: ../pagina-web/pythonassipt/images
  github-fork-marca.png
  open-pull-request.png
  pull-request-editado.png
  criando-repositorio.png
  merge-pull-request.png
  pull-request.png
  github-fork.png
0 diretório(s), 7 arquivo(s)
In [ ]:
 

Comentários

Comments powered by Disqus