Manipulação do sistema de ficheiros do disco

A manipulação de ficheiros e pastas em Python é um requisito essencial para diversos tipos de aplicações. O Python oferece várias bibliotecas para trabalhar com o sistema de ficheiros, como ospathlib e shutil

Obter a pasta atual

import os

print(os.getcwd())  # Retorna a pasta atual

Mudar de pasta

import os

os.chdir('novo_caminho')  # Muda para outra pasta
print(os.getcwd())

Criar uma pasta

import os

os.mkdir('novo_diretorio')  # Cria um diretório no caminho especificado

Listar ficheiros e subpastas

import os

print(os.listdir())  # Lista os itens na pasta atual

Eliminar um ficheiro

import os

os.remove("dados.txt")

Eliminar uma pasta vazia

import os

os.rmdir("imagens")

NOTA: para removermos uma pasta não vazia, devemos usar o método rmtree() do módulo shutil.

Renomear ficheiro ou pasta

import os

#Renomeia a pasta "imagens" para "videos"
os.rename("imagens", "videos")

Caminhos de ficheiros

import os

path = "/home"
file_path = os.path.join(path, "mycomputer", "codenet", "python.txt")
print(file_path)

Output:

/home/mycomputer/codenet/python.txt

Remover todos os ficheiros de uma pasta

import os

def delete_files_in_directory(directory_path):
   try:
     files = os.listdir(directory_path)
     for file in files:
       file_path = os.path.join(directory_path, file)
       if os.path.isfile(file_path):
         os.remove(file_path)
     print("Ficheiros eliminados com sucesso.")
   except OSError:
     print("Erro na eliminação dos ficheiros.")

# Uso
directory_path = '/path/to/directory'
delete_files_in_directory(directory_path)

O módulo pathlib foi introduzido no Python 3.4 e revolucionou a forma como lidamos com caminhos de ficheiros e diretórios, oferecendo uma abordagem orientada a objetos, multiplataforma e muito mais intuitiva do que o uso de strings tradicionais

A classe Path, do módulo pathlib, representa um caminho no sistema de ficheiros, seja ele absoluto ou relativo.

Criando objetos Path

from pathlib import Path

# Caminho relativo
p = Path("meu_ficheiro.txt")

# Caminho absoluto
p_abs = Path("/home/utilizador/documentos")

# Caminho do ficheiro atual
p_atual = Path(__file__)

# Pasta atual e pasta home
p_cwd = Path.cwd()
p_home = Path.home()

Podemos combinar caminhos facilmente usando o operador /:

p_home = Path.home()
novo_caminho = p_home / "projetos" / "python"

Propriedades e métodos uteis

Propriedades

  • name: nome do ficheiro
  • stem: nome sem extensão
  • suffix: extensão
  • parent: diretório pai
  • parts: tupla com cada parte do caminho
from pathlib import Path
p = Path("/home/utilizador/documentos/dados.txt")

print(p.name)      # 'dados.txt'
print(p.stem)      # 'dados'
print(p.suffix)    # '.txt'
print(p.parent)    # \home\utilizador\documentos

Métodos

  • exists(): verifica se o caminho existe
  • is_file(): verifica se é ficheiro
  • is_dir(): verifica se é diretório
from pathlib import Path
p = Path("/home/utilizador/documentos/dados.txt")

if p.exists():
    print("Existe!")
else:
    print("Não existe")

Listar conteúdo de uma pasta

from pathlib import Path
pasta = Path("c:\\python\\sintaxe")

for py_file in pasta.iterdir():
    print(py_file)

Listar conteúdo de uma pasta por padrão

from pathlib import Path
pasta = Path("c:\\python\\sintaxe")

for py_file in pasta.glob("*.py"):
    print(py_file)

Criar pasta

nova_pasta = Path("nova_pasta")
nova_pasta.mkdir(exist_ok=True)

O parâmetro exist_ok=True implica qeu a pasta só é criada se não existir.

Remover ficheiro

from pathlib import Path

# Especifica o caminho do ficheiro
file_path = Path('example.txt')

# Verifica se o ficheiro existe antes de o eliminar
if file_path.exists():
    # Elimina o ficheiro
    file_path.unlink()
    print(f"{file_path} eliminado.")
else:
    print(f"{file_path} inexistente.")

Remover pasta vazia

from pathlib import Path

# Especifica caminho da pasta
dir_path = Path(r”C:\ToDos\Archive”)

# Remove a pasta vazia
dir_path.rmdir()

# Report the result
print(f”‘{dir_path}’ eliminada!”)

NOTA: para removermos uma pasta não vazia, devemos usar o método rmtree() do módulo shutil.

Renomear ficheiro ou pasta

from pathlib import Path

path = Path("data.txt")
path.rename("dados.bin")

O módulo shutil é essencial para operações de alto nível com arquivos e diretórios em Python, oferecendo funcionalidades como cópia, movimentação, exclusão e compactação de ficheiros.

O módulo shutil faz parte da biblioteca padrão do Python e é usado para:

  • Copiar ficheiros e diretórios.
  • Mover ficheiros entre locais.
  • Excluir árvores de diretórios.
  • Compactar e descompactar ficheiros.
  • Verificar espaço em disco.

Copiar ficheiros

O módulo shutil possui 3 métodos para copiar ficheiros:

  • shutil.copy(src, dst): Copia o conteúdo do ficheiro src para dst (preserva permissões básicas).
  • shutil.copy2(src, dst): Copia conteúdo e metadados (timestamps de modificação/acesso).
  • shutil.copyfile(src, dst): Copia apenas o conteúdo (sem metadados).

Nenhum deste métodos copia pastas.

Exemplo 1:

import shutil

# Copiar ficheiro
shutil.copy('origem.txt', 'destino.txt')

# Copiar com metadados
shutil.copy2('origem.txt', 'backup.txt')

#Copia conteudo
shutil.copyfile('origem.txt', 'destino2.txt')

# Copiar ficheiro para pasta 'tmp'
shutil.copy('origem.txt', 'tmp')

Mover ficheiros

shutil.move('origem.txt', 'tmp')  # Move ou renomeia

O exemplo acima move o ficheiro ‘origem.txt’ para a pasta ‘tmp’.

Remover pastas

Exemplo 1:

import shutil

shutil.rmtree("tmp")

O exemplo acima remove a pasta ‘tmp’. A pasta ‘tmp’ pode estar vazia ou com ficheiros e subpastas.

Exemplo 2:

import shutil 
import os 
   
# location 
location = "C:/python/"
   
# directory 
dir = "Sintaxe"
   
# path 
path = os.path.join(location, dir) 
   
# remove pasta 
shutil.rmtree(path) 

Copiar pastas

Exemplo 1:

# Copiar tudo, exceto arquivos .tmp e .log
shutil.copytree(
    'tmp', 
    'backup_tmp'
)

Neste exemplo, copia todos os ficheiros da pasta ‘tmp’ para a pasta ‘backup_tmp.

Exemplo 2:

# Copiar tudo, exceto arquivos .tmp e .log
shutil.copytree(
    'tmp', 
    'backup_tmp', 
    ignore=shutil.ignore_patterns('*.tmp', '*.log')
)

Neste exemplo, copia todos os ficheiros da pasta ‘tmp’ para a pasta ‘backup_tmp’, exceto os ficheiros com a extensão .py.

Tratamento de erros

try:
    shutil.rmtree('imagens')
except shutil.Error as e:
    print(f"Erro: {e.args[0]}")