Curso
Muitos programas Python precisam navegar no sistema de arquivos para ler e gravar arquivos. Uma operação comum é buscar o diretório de trabalho atual, que geralmente é abreviado como CWD.
O Python tem dois módulos principais que podem ser usados para acessar os caminhos do sistema de arquivos: omódulo os
e o módulo pathlib
.
O módulo os
oferece a abordagem tradicional para obter o diretório de trabalho atual e trabalha com caminhos e com o sistema de arquivos.
O pathlib
é um módulo mais recente que oferece uma abordagem orientada a objetos que é robusta e multiplataforma.
Neste tutorial, exploro as várias técnicas para buscar e manipular o diretório de trabalho atual. Se você quiser saber mais sobre Python, fique à vontade para explorar algumas das minhas outras publicações no blog:
- Cache do Python: Dois métodos simples
- Python timedelta: Trabalhando com intervalos de tempo em Python
- Como converter strings em bytes em Python
Python: Como obter o diretório de trabalho atual (CWD)
O diretório de trabalho atual é o diretório no qual um programa Python é executado. Ele serve como ponto de referência para caminhos relativos de arquivos e permite que o programa acesse arquivos e recursos dentro da hierarquia de diretórios.
Vamos ver como você pode acessar o diretório de trabalho atual usando os módulos os
e pathlib
e comparar as duas soluções.
Usando os.getcwd()
O módulo os
permite o acesso ao sistema operacional do computador. A função getcwd()
obtém o diretório de trabalho atual:
import os
cwd = os.getcwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
A saída mostra o caminho do diretório que contém o script. O formato do caminho depende do sistema operacional. A saída acima é para sistemas operacionais POSIX, como Linux, Unix e macOS.
O mesmo caminho em um sistema Windows seria exibido da seguinte forma:
C:\Users\sg\Documents\GitHub\datacamp
O valor retornado por os.getcwd()
é uma cadeia de caracteres:
print(type(cwd))
<class 'str'>
Portanto, precisamos usar métodos de cadeia de caracteres e outras operações de cadeia de caracteres para lidar com esse caminho.
Usando pathlib.Path.cwd()
O Python 3.4 introduziu o módulo pathlib
, que oferece uma abordagem orientada a objetos para acessar e manipular caminhos de arquivos. A classe principal em pathlib
é Path
, que podemos importar antes de obter o diretório de trabalho atual:
from pathlib import Path
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
A saída impressa de Path.cwd()
é semelhante ao valor retornado por os.getcwd()
. No entanto, o site Path.cwd()
não retorna uma string. Você pode confirmar isso imprimindo o tipo do objeto retornado ou exibindo sua representação oficial em string usando repr()
:
print(type(cwd))
print(repr(cwd))
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')
Em um computador Windows, Path.cwd()
retorna um objeto WindowsPath
.
Os objetos PosixPath
e WindowsPath
oferecem funcionalidade semelhante para permitir programas entre plataformas. Aqui estão alguns dos atributos desses objetos:
print(cwd.parent)
print(cwd.name)
/Users/sg/Documents/GitHub
datacamp
Sempre que possível, é preferível que você use o módulo pathlib
, que é mais moderno e facilita o tratamento de caminhos. Você pode ler este guia completo para você usar o pathlib em Python se você quiser saber mais.
Trabalhando com o diretório atual
Os programas Python geralmente precisam manipular o caminho, por exemplo, para salvar um arquivo em uma subpasta. Vamos supor que precisamos criar um novo subdiretório em nosso diretório de trabalho atual e salvar um arquivo de texto na nova pasta.
Usando o os
módulo
A função getcwd()
no módulo os
retorna uma cadeia de caracteres. Portanto, é possível alterar manualmente essa cadeia de caracteres para modificar o caminho. No entanto, as modificações necessárias variam de acordo com o sistema operacional, pois sistemas diferentes têm formatos de caminho diferentes. Uma opção melhor é usar o site os.path.join()
:
import os
cwd = os.getcwd()
output_path = os.path.join(cwd, "testing_os")
print(output_path)
/Users/sg/Documents/GitHub/datacamp/testing_os
O caminho que os.path.join()
retorna está no formato correto para o sistema operacional que está sendo usado. Isso retorna uma cadeia de caracteres com o novo caminho. Podemos verificar se essa subpasta existe com os.path.exists()
, que retorna um booleano:
print(os.path.exists(output_path))
False
Isso mostra que o caminho representado por output_path
ainda não existe. O módulo os
fornece ferramentas para que você crie essa pasta. A função os.mkdir()
cria um novo diretório:
os.mkdir(output_path)
print(os.path.exists(output_path))
True
A nova subpasta agora existe e novos arquivos podem ser salvos nessa pasta:
output_file = os.path.join(output_path, "test.txt")
with open(output_file, "w") as file:
file.write("Testing path modification with the 'os' module")
A variável output_file
contém o nome do arquivo de saída desejado com o caminho completo. Esse arquivo de texto é criado na subpasta /testing_os
dentro do diretório de trabalho atual.
Também podemos listar todos os itens em uma pasta usando os.listdir()
:
for item in os.listdir(output_path):
print(item)
test.txt
A função os.listdir()
retorna uma lista com todos os itens do diretório. Esse código percorre essa lista para exibir cada arquivo ou pasta em uma linha separada. Neste exemplo, o diretório contém um único arquivo de texto.
Usando o pathlib
módulo
O módulo pathlib
mais recente também oferece ferramentas para que você crie novos caminhos. Este módulo usa o operador de barra /
para combinar elementos em um caminho. Esse é o mesmo operador usado para a divisão de tipos de dados numéricos, mas também é o caractere usado em caminhos de arquivos nos sistemas operacionais POSIX. Vamos criar um novo caminho e verificar se ele ainda não existe:
from pathlib import Path
cwd = Path.cwd()
output_path = cwd / "testing_pathlib"
print(output_path)
print(Path.exists(output_path))
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
False
A classe Path
tem seu próprio método .mkdir()
para criar um novo diretório:
Path.mkdir(output_path)
print(Path.exists(output_path))
True
Como output_path
é um objeto PosixPath
ou WindowsPath
, podemos usar o operador de barra em qualquer lugar para criar um novo caminho:
with open(output_path / "test.txt", "w") as file:
file.write("Testing path modification with the 'pathlib' module")
O novo arquivo de texto é criado na pasta /testing_pathlib
.
Podemos usar o método Path
.iterdir()
para iterar cada item em uma pasta:
for item in Path.iterdir(output_path):
print(item)
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txt
Como ocorre com outras ferramentas em pathlib
, o valor retornado não é uma cadeia de caracteres. Em vez disso, é um objeto PosixPath
ou WindowsPath
. Você pode usar o atributo .name
para exibir o nome do arquivo ou da pasta sem o caminho completo:
for item in Path.iterdir(output_path):
print(item.name)
test.txt
Enquanto os.listdir()
retorna uma lista, pathlib.Path.iterdir()
retorna um objeto generator
(você pode ler este tutorial sobre Iteradores e geradores do Python do Python se você precisar de uma atualização):
print(Path.iterdir(cwd))
<generator object Path.iterdir at 0x1036b2c20>
Esse comportamento segue as práticas recomendadas do Python moderno, pois os iteradores e geradores são mais eficientes em determinadas situações.
Alteração do diretório de trabalho atual (CWD)
Também é possível alterar o diretório de trabalho atual diretamente de um programa Python usando os.chdir()
. Como essa não é uma operação diretamente relacionada ao caminho, não há uma versão alternativa em pathlib
. No entanto, ainda podemos usar os objetos pathlib.Path
como argumentos:
import os
from pathlib import Path
cwd = Path.cwd()
print(cwd)
os.chdir(cwd.parent)
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHub
O diretório de trabalho foi alterado. Também podemos usar o site cwd.parent.resolve()
para garantir que todos os links simbólicos sejam tratados corretamente. O argumento em os.chdir()
também pode ser uma cadeia de caracteres, como os caminhos retornados pelas funções no módulo os
.
É necessário ter cuidado ao alterar o diretório de trabalho em um programa para garantir que você não tenha nenhum comportamento inesperado.
Práticas recomendadas e dicas
Aqui estão algumas práticas recomendadas e dicas para você trabalhar com caminhos em Python:
Conclusão
A navegação e a manipulação de caminhos de arquivos é um requisito comum em muitos programas Python. O módulo os
fornece as funções tradicionais para lidar com essas tarefas, enquanto o módulo pathlib
oferece uma abordagem mais moderna e orientada a objetos. O uso do site pathlib
não apenas simplifica muitas operações, mas também garante que seu código permaneça multiplataforma e mais fácil de ler.
Não importa se você está mantendo uma base de código existente que usa o os
ou iniciando um novo projeto em que pode aproveitar o pathlib
, entender os dois módulos e seus recursos lhe dará a flexibilidade e a confiança para gerenciar caminhos em qualquer projeto Python.
Você pode continuar sua jornada de aprendizado de Python com esses cursos:
Estudei Física e Matemática em nível superior na Universidade de Malta. Depois, mudei-me para Londres e fiz meu doutorado em Física no Imperial College. Trabalhei em novas técnicas ópticas para obter imagens da retina humana. Agora, meu foco é escrever sobre Python, comunicar sobre Python e ensinar Python.