Ver Feed RSS

root@blog:/# chmod o+r *

Python: Estrutura de Arquivos

Avalie este Post de Blog
Python é uma linguagem muito utilizada para fazer scripts em linux. E muitos scripts lidam com estrutura de arquivos, por exemplo: renomear todas as pastas e subpastas dentro de uma certo local.

Em Python tem um módulo muito útil pra isso: Módulo OS. O Mósulo OS tem diversas funcionalidades, dentre elas vou mostrar hoje a função walk.

Primeiro vamos ver o ambiente. Criei uma estrutura de arquivos bem simples:
Código :
[FONT=Courier New].[/FONT][FONT=Courier New]
├───p1
│   ├───p11[/FONT][FONT=Courier New]
│   │   [/FONT][FONT=Courier New]├───p111[/FONT][FONT=Courier New]
│   │   [/FONT][FONT=Courier New]├───f111.txt[/FONT][FONT=Courier New]
│   │   └───f112.txt
│   ├───p12[/FONT][FONT=Courier New]
│   │   └───f121.txt[/FONT][FONT=Courier New]
│   ├───p13[/FONT][FONT=Courier New]
│   │   [/FONT][FONT=Courier New]├───f131.txt[/FONT][FONT=Courier New]
│   │   └───f132.txt[/FONT][FONT=Courier New]
│   ├───f11.txt[/FONT][FONT=Courier New]
│   └───f12.txt
└───p2
    ├───p21[/FONT][FONT=Courier New]
    │   [/FONT][FONT=Courier New]├───f211.txt
 [/FONT][FONT=Courier New]   │   └───f212.txt[/FONT][FONT=Courier New]
    ├───p22[/FONT][FONT=Courier New]
    │   [/FONT][FONT=Courier New]├───f221.txt
  [/FONT][FONT=Courier New]  │   └───f222.txt[/FONT][FONT=Courier New]
    └───p23[/FONT][FONT=Courier New]
[/FONT]
Como podem ver tentei criar uma estrutura sem um padrão exato. Vamos ver como o Python trabalha com isso:

Código :
[FONT=Courier New]>>> from os import walk
>>> tree = walk('.')
>>> for root, dirs, files in tree:
...     print "Root:",root,"- Dirs:",dirs,"/ Files:",files
...
Root: . - Dirs: ['p1', 'p2'] / Files: []
Root: .\p1 - Dirs: ['p11', 'p12', 'p13'] / Files: ['f11.txt', 'f12.txt']
Root: .\p1\p11 - Dirs: ['p111'] / Files: ['f111.txt', 'f112.txt']
Root: .\p1\p11\p111 - Dirs: [] / Files: []
Root: .\p1\p12 - Dirs: [] / Files: ['f121.txt']
Root: .\p1\p13 - Dirs: [] / Files: ['f131.txt', 'f132.txt']
Root: .\p2 - Dirs: ['p21', 'p22', 'p23'] / Files: []
Root: .\p2\p21 - Dirs: [] / Files: ['f211.txt', 'f212.txt']
Root: .\p2\p22 - Dirs: [] / Files: ['f221.txt', 'f222.txt']
Root: .\p2\p23 - Dirs: [] / Files: []
>>>[/FONT]
Como podem ver, primeiro ele lista o conteúdo do diretório corrente: duas pastas, p1 e p2 e nenhum arquivo. Depois o conteúdo da primeira pasta dentro do diretório corrente (p1): Pastas: p11, p12 e p13 e os arquivos f11.txt e f12.txt. E assim sucessivamente...

Pronto, assim podemos percorrer todos os arquivos dentro de uma certa pasta. Por exemplo, um script que imprime o caminho completo de todos os arquivos:

Código :
[FONT=Courier New]>>> from os import walk, sep
>>> tree = walk('.')
>>> for root, dirs, files in tree:
...     for file in files:
...         print root+sep+file
...
.\p1\f11.txt
.\p1\f12.txt
.\p1\p11\f111.txt
.\p1\p11\f112.txt
.\p1\p12\f121.txt
.\p1\p13\f131.txt
.\p1\p13\f132.txt
.\p2\p21\f211.txt
.\p2\p21\f212.txt
.\p2\p22\f221.txt
.\p2\p22\f222.txt[/FONT]
Nesse script utilizei algo muito útil para a portabilidade de scripts: o sep. O sep (na verdade os.sep, eu importei ele separado, assim como o os.walk) é o separador padrão para cada sistema, em windows o sep é \ enquanto em Linux e MAC o sep é /. Utilizar o sep torna o código portável, ele pode ser exectado tanto em Windows como em Linux.

Agora, vamos a algo mais complicado! Vocês lembram de recursividade?! Pois é, esse é um script que usa a recursividade para criar uma saída similar ao comando tree do windows:

Código :
[FONT=Courier New]from os import walk, sep
 
def scan_pastas(espaco, nome_raiz):
    nome_raiz, pastas_raiz = walk(nome_raiz).next()[:2]
    for pasta in pastas_raiz:
        print espaco+"-"+pasta
        scan_pastas(espaco+" |",nome_raiz+sep+pasta)
        print espaco
 
if __name__ == "__main__":
    print '.'
    scan_pastas("|",'.')[/FONT]
Agora tenstando ele:
Código :
[FONT=Courier New]$ python dirs.py
.
|-p1
| |-p11
| | |-p111
| | |
| |
| |-p12
| |
| |-p13
| |
|
|-p2
| |-p21
| |
| |-p22
| |
| |-p23
| |
|[/FONT]
Como podem ver ele monta uma estrutura hierárquica das pastas a partir da pasta principal. Claro, ele pode ser melhorado para produzir uma saída mais legal, mas como isso é somente para fins de demonstração não trabalhei muito com isso!

Como eu disse quando falei de recursividade, talvez isso pudesse ser realizado em um loop, mas seria muito difícil de implementar! Se alguém conseguir posta ai nos comentário!

Ainda essa semana mostro como fazer um script para renomear as pastas e arquivos...

Até mais!
Categorias
Dicas , Python , Artigos , Dicas

Comentários

  1. Avatar de krixapolinario
    Muito bom o post, gostei muito!!! :)

    Obrigada pela visita no meu blog.
  2. Avatar de Magnun
    Obrigado! Sempre visito seu blog, só que nem sempre comento!

+ Enviar Comentário