Módulo OS Python

Este módulo fornece uma maneira portátil de usar funcionalidades dependentes do sistema operacional.

Pathlib vs Módulo OS

O módulo pathlib fornece muito mais funcionalidades do que as listadas aqui, como obter o nome do arquivo, obter a extensão do arquivo, ler/escrever um arquivo sem abri-lo manualmente, etc. Consulte a documentação oficial se você pretende saber mais.
Para uma análise mais aprofundada de ambos, consulte a página Caminhos de Arquivos e Diretórios.

Caminhos no Linux e Windows

No Windows, os caminhos são escritos usando barras invertidas (\) como separador entre os nomes das pastas. Em sistemas operacionais baseados em Unix, como macOS, Linux e BSDs, a barra normal (/) é usada como separador de caminho. Juntar caminhos pode ser um problema se o seu código precisar funcionar em diferentes plataformas.

Felizmente, o Python nos fornece os.path.join para lidar com isso.

import os

# Junta componentes de caminho usando o separador correto para o SO
os.path.join('usr', 'bin', 'spam')
usr\bin\spam

Juntar caminhos é útil se você precisar criar diferentes caminhos de arquivo sob o mesmo diretório.

my_files = ['accounts.txt', 'details.csv', 'invite.docx']

# Junta cada nome de arquivo com o diretório base
for filename in my_files:
    print(os.path.join('/home/labex/project', filename))
/home/labex/project/accounts.txt
/home/labex/project/details.csv
/home/labex/project/invite.docx

O diretório de trabalho atual

import os

# Obtém o diretório de trabalho atual
os.getcwd()
/home/labex/project
# Altera o diretório de trabalho atual
os.chdir('/usr/bin')

# Verifica a alteração
os.getcwd()
/usr/bin

Criação de novas pastas

import os
# Cria diretórios recursivamente (cria todos os diretórios pais se necessário)
os.makedirs('/tmp/delicious/walnut/waffles')

Caminhos Absolutos vs. Relativos

Existem duas maneiras de especificar um caminho de arquivo.

  • Um caminho absoluto, que sempre começa com a pasta raiz
  • Um caminho relativo, que é relativo ao diretório de trabalho atual do programa

Existem também as pastas ponto (.) e ponto-ponto (..). Estas não são pastas reais, mas nomes especiais que podem ser usados em um caminho. Um único ponto (“dot”) para um nome de pasta é um atalho para “este diretório”. Dois pontos (“dot-dot”) significam “a pasta pai”.

Lidando com caminhos absolutos

Para ver se um caminho é um caminho absoluto:

import os
# Verifica se o caminho é absoluto (começa com a raiz)
os.path.isabs('/')
True
# Caminhos relativos retornam False
os.path.isabs('..')
False

Você também pode extrair um caminho absoluto:

import os
# Obtém o diretório atual primeiro
os.getcwd()
/home/labex/project
# Converte caminho relativo para caminho absoluto
os.path.abspath('..')
/home

Lidando com caminhos relativos

Você pode obter um caminho relativo de um caminho inicial para outro caminho.

import os
# Obtém o caminho relativo do caminho inicial para o caminho de destino
os.path.relpath('/etc/passwd', '/')
etc/passwd

Validade de Caminho e Arquivo

Verificando se um arquivo/diretório existe

import os

# Verifica se o caminho existe (arquivo ou diretório)
os.path.exists('.')
True
os.path.exists('setup.py')
True
os.path.exists('/etc')
True
os.path.exists('nonexistentfile')
False

Verificando se um caminho é um arquivo

import os

# Verifica se o caminho é um arquivo
os.path.isfile('setup.py')
True
os.path.isfile('/home')
False
os.path.isfile('nonexistentfile')
False

Verificando se um caminho é um diretório

import os

# Verifica se o caminho é um diretório
os.path.isdir('/')
True
os.path.isdir('setup.py')
False
os.path.isdir('/spam')
False

Obtendo o tamanho de um arquivo em bytes

import os

# Obtém o tamanho do arquivo em bytes
os.path.getsize('/usr/bin/python3')
776192

Listando diretórios

import os

# Lista todos os arquivos e diretórios no caminho especificado
os.listdir('/usr/bin')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
--snip--
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']

Tamanhos de arquivos de diretório

AVISO

Diretórios também têm um tamanho! Portanto, você pode querer verificar se um caminho é um arquivo ou diretório usando os métodos discutidos na seção anterior.

import os
total_size = 0

# Calcula o tamanho total de todos os arquivos no diretório
for filename in os.listdir('/usr/bin'):
    # Junta o caminho do diretório com o nome do arquivo e obtém o tamanho
    total_size = total_size + os.path.getsize(os.path.join('/usr/bin', filename))
print(total_size)
1117846456

Excluindo arquivos e pastas

  • Chamar os.unlink(path) excluirá o arquivo no caminho.

  • Chamar os.rmdir(path) excluirá a pasta no caminho. Esta pasta deve estar vazia de quaisquer arquivos ou pastas.

Percorrendo uma Árvore de Diretórios

import os

# Percorre a árvore de diretórios recursivamente
for folder_name, subfolders, filenames in os.walk('/tmp/delicious'):
    print(f'A pasta atual é {folder_name}')
    # Itera sobre subdiretórios
    for subfolder in subfolders:
        print(f'SUBPASTA DE {folder_name}: {subfolder}')
    # Itera sobre nomes de arquivos
    for filename in filenames:
        print(f'ARQUIVO DENTRO DE {folder_name}: filename{filename}')
    print('')
A pasta atual é /tmp/delicious
SUBPASTA DE /tmp/delicious: cats
SUBPASTA DE /tmp/delicious: walnut
ARQUIVO DENTRO DE /tmp/delicious: spam.txt

A pasta atual é /tmp/delicious/cats
ARQUIVO DENTRO DE /tmp/delicious/cats: catnames.txt
ARQUIVO DENTRO DE /tmp/delicious/cats: zophie.jpg

A pasta atual é /tmp/delicious/walnut
SUBPASTA DE /tmp/delicious/walnut: waffles

A pasta atual é /tmp/delicious/walnut/waffles
ARQUIVO DENTRO DE /tmp/delicious/walnut/waffles: butter.txt
Morty Proxy This is a proxified and sanitized view of the page, visit original site.