Iteração Python com o sistema operacional

Introdução

.
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── dir2
│   ├── subdir1
│   └── subdir2
│       ├── file1
│       └── file2
├── file1
└── file2

A estrutura apresentada acima é a arvore que iremos executar os testes em linguagem Python.

Escopo

Neste tutorial será apresentado somente remoção de arquivos e diretórios. Na republicação disponível em Brito: Manipulando arquivos Grande em Python é apresentado a cópia

Como o Python é multiplataforma, estes comandos não são apenas para GNU/Linux, eles também servem para outros Sistemas Operacionais como MS/Windows, IOS e Unix.

Partiremos do principio que seu ambiente python esteja instalado, operacional e configurado.

Será apresentado a execução direta pela console python, e via script.

Instalação

Como dito no escopo não será abordado a instalação, entretanto se o seu sistema operacional é GNU/Linux, você poderá seguir a estes tutoriais:

  1. Brito: Instalar várias versões de Python sobre GNU/Linux
  2. Brito: Instalar várias versões de Python sobre GNU/Linux via buildout
  3. Brito: Virtualenv Python - Encapsulamento de mudanças

procedimentos

A linguagem Python permite configurações específicas para os scripts e programas, que são realizadas no ambiente de execução, assim como as linguagens comumente utilizadas em meio corporativo.

Mas uma vantagem que poucas linguagens permitem é a criação de instâncias de ambientes facilmente escaláveis e replicáveis, detalhes em Brito: Pip - User Guide e Brito: pip freeze.

No tutorial Brito: Ativar e desativar virtualenv, é apresentado como alternar entre os ambientes virtuais python, com suas configurações específicas e pacotes distintos.

Será realizado todos os procedimentos em um ambiente de teste, criado no /tmp.

criar ambientes de testes

$mkdir /tmp/env
$cd /tmp/env
$for ((i=1;i<=2;i++)); do for ((j=1;j<=2;j++)); do mkdir -p dir$i/subdir$j; touch dir$i/subdir$i/file$j; touch file$i; done; done
$for ((i=1;i<=2;i++)); do for ((j=1;j<=2;j++)); do mkdir -p dir$i/subdir$j; touch dir$i/subdir$i/file$j; touch file$i; done; done

Quem estiver utilizando o MS/Windows faça pela parte gráfica. ;-)

O ambiente deverá ficar assim:

.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── dir2
│   ├── subdir1
│   └── subdir2
│       ├── file1
│       └── file2
├── file1
└── file2

Criando o ambiente virtual python para este propósito

$ virtualenv-2.7 ~/projetos/py27-`date +%s`

Ativar ambiente virtual python criado para os testes

$ source ~/projetos/py27-1437408269/bin/activate
(py27-1437408269) $

Console

Acesse o console Python.

Todos os comandos nesta sessão deverão ser executados no console Python.

(py27-1437408269) $ cd /tmp/env
(py27-1437408269) $ python
Python 2.7.10 (default, Jul 16 2015, 11:58:21) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> 

Bibliotecas

Para iniciar importa-se as bibliotecas necessárias para trabalhar com o Sistema Operacional, 'os' e 'shutil'.

>>> import os, shutil

Exibir o conteúdo

Também é possível executar comandos do sistema operacional, para listagem de conteúdo, como os comandos dir(ms/dos) ou ls(GNU/linux).

>>> os.system('dir')
dir1  dir2  file1  file2
0
>>> os.system('ls')
dir1  dir2  file1  file2
0
>>> os.system('ls dir1')
subdir1  subdir2
0
>>> os.system('ls dir1/subdir1')
file1  file2
0
>>> os.system('ls dir2/subdir1')
0

Remover diretórios vazios

>>> os.rmdir('dir2/subdir1')
>>> 

Se não estiver vazio não será aceito o comando

>>> os.rmdir('dir2/subdir2')
Traceback (most recent call last):
  File "", line 1, in 
OSError: [Errno 39] Directory not empty: 'dir2/subdir2'
>>> 

Remover arquivos

>>> os.remove('dir2/subdir2/file2')
>>> 

Remover arvores

Este comando remove completamente o diretório e todo o seu conteúdo. E é irreversível.

>>> shutil.rmtree('dir2')
>>>

Estrutura atualizada

>>> os.system('tree .')
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── file1
└── file2

3 directories, 4 files
0
>>>

Remover arvores caminho absoluto

Este comando remove completamente o diretório e todo o seu conteúdo. E é irreversível.

>>> shutil.rmtree('/tmp/env')
>>>

Script Python

Agora tudo novamente, mas em scripts python.

Crie novamente o ambiente de testes descrito em procedimentos.

Acesse o diretório principal do ambiente.

A estrutura deverá estar como demonstrada abaixo:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── dir2
│   ├── subdir1
│   └── subdir2
│       ├── file1
│       └── file2
├── file1
└── file2

6 directories, 6 files

Como a arvore '/tmp/env' será removida no final, iremos colocar o script python em '~/projetos/bin', que ainda não exite.

Para editor irei utilizar o 'vim', utilize o seu preferido.

$ mkdir -pv ~/projetos/bin
$ vim ~/projetos/bin/example_file.py

Script Python para estudo

Para facilitar a execução do script de forma limpa, foi acrescentado manipulação de erros.

executar Script Python

python ~/projetos/bin/example_file.py

Saída script

Saída comando >>> os.system('dir')
dir1  dir2  file1  file2

Saída comando >>> os.system('ls')
dir1  dir2  file1  file2

Saída comando >>> os.system('tree')
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── dir2
│   ├── subdir1
│   └── subdir2
│       ├── file1
│       └── file2
├── file1
└── file2

6 directories, 6 files

Executando comando >>> os.rmdir('dir2/subdir1')
executado com sucesso!

Saída comando >>> os.system('tree')
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── dir2
│   └── subdir2
│       ├── file1
│       └── file2
├── file1
└── file2

5 directories, 6 files

Executando comando >>> os.rmdir('dir2/subdir2')
Ops: [Errno 39] Directory not empty: 'dir2/subdir2'

Executando comando >>> os.rmdir('dir2/subdir2/file2')
executado com sucesso!

Executando comando >>> shutil.rmtree('dir2/')
executado com sucesso!

Saída comando >>> os.system('tree')
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
├── file1
└── file2

3 directories, 4 files

Executando comando >>> shutil.rmtree('/tmp/env/')
executado com sucesso!

Referências

http://stackoverflow.com/questions/6996603/how-do-i-delete-a-file-or-folder-in-python

Comentários