O código abaixo não se juntará, quando depurado, o comando não armazena todo o caminho, mas apenas a última entrada.
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
Quando eu testo isso, ele armazena apenas a /new_sandbox/
parte do código.
os.path.normpath
para atingir esse objetivo.A idéia
os.path.join()
é tornar seu programa multiplataforma (linux / windows / etc).Até uma barra arruina.
Portanto, só faz sentido quando usado com algum tipo de ponto de referência como
os.environ['HOME']
ouos.path.dirname(__file__)
.fonte
os.path.join()
pode ser usado em conjunto comos.path.sep
para criar um caminho absoluto em vez de relativo.fonte
os.path.sep
como primeiro elemento para construir um caminho absoluto é melhor do que qualquer outra resposta aqui! O objetivo de usaros.path
métodos str, em vez dos básicos, é evitar a escrita/
. Colocar todos os subdiretórios como um novo argumento e remover todas as barras também é ótimo. Provavelmente, seria uma boa idéia garantir uma verificação quetodaystr
não comece com uma barra! ;)Não use barras no início dos componentes do caminho, exceto quando se referir ao diretório raiz:
consulte também: http://docs.python.org/library/os.path.html#os.path.join
fonte
Para ajudar a entender por que esse comportamento surpreendente não é totalmente terrível, considere um aplicativo que aceite um nome de arquivo de configuração como argumento:
Se o aplicativo for executado com:
O arquivo de configuração
/etc/myapp.conf/foo.conf
será usado.Mas considere o que acontece se o aplicativo for chamado com:
Então
myapp
deve usar o arquivo de configuração em/some/path/bar.conf
(e não/etc/myapp.conf/some/path/bar.conf
ou similar).Pode não ser ótimo, mas acredito que essa é a motivação para o comportamento do caminho absoluto.
fonte
É porque você
'/new_sandbox/'
começa com a/
e, portanto, é assumido como sendo relativo ao diretório raiz. Remova a guia/
.fonte
Para tornar sua função mais portátil, use-a da seguinte maneira:
ou
fonte
Experimente a combinação de
split("/")
e*
para cadeias de caracteres com junções existentes.Como funciona...
split("/")
transforma o caminho existente em lista:['', 'home', 'build', 'test', 'sandboxes', '']
*
na frente da lista divide cada item da lista com seu próprio parâmetrofonte
Tente
new_sandbox
apenasfonte
faça assim, sem as barras extras
fonte
Observe que um problema semelhante pode incomodá-lo se você
os.path.join()
incluir uma extensão que já inclua um ponto, que é o que acontece automaticamente quando você o usaos.path.splitext()
. Neste exemplo:Mesmo que
extension
pode ser.jpg
que você acabar com uma pasta chamada "foobar", em vez de um arquivo chamado "foobar.jpg". Para evitar isso, você precisa anexar a extensão separadamente:fonte
você pode
strip
a'/'
:fonte
Eu recomendo remover da segunda e das seguintes seqüências de caracteres a string
os.path.sep
, impedindo que elas sejam interpretadas como caminhos absolutos:fonte
uma versão mais completa:
fonte
"\"
? Então seu primeiro exemplo se tornaos.path.join("a", *"/b".split("\\"))
, o que produz"/b"
... Duvido que seja o resultado pretendido.