Como usar “/” (separador de diretório) no Linux e Windows no Python?

191

Eu escrevi um código em python que usa / para criar um arquivo específico em uma pasta; se eu quiser usar o código no Windows, ele não funcionará; existe uma maneira de usar o código no Windows e Linux.

Em python, estou usando este código:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Quando vou usar o meu código em suponha que o windows machine meu código não funcione.

Como uso "/" (separador de diretório) no Linux e no Windows?

hulk007
fonte
1
Você pode defini-lo no início, dependendo do Win / * nix, e depois trabalhar com a variável.
fedorqui 'SO stop prejudying'
12
No Windows, você pode usar \ ou / como um separador de diretório.
SecurityMatt
12
O Windows suporta /em caminhos de diretório. Que problema específico você está tendo? Poste um código que ilustra o problema.
Michael Geary
A menos que você dependa dos programas de espaço do usuário do Windows, a barra para frente funciona bem como para trás. Alguns comandos cmd têm problemas com isso, no entanto.
Pihhan
1
@ Mehrdad: Você conhece um exemplo para o qual a API do Win32 não aceita '/'? (sem contar cmd.exe e outros programas)
Eryk Sun

Respostas:

266

Use os.path.join(). Exemplo: os.path.join(pathfile,"output","log.txt").

No seu código, isso seria: rootTree.write(os.path.join(pathfile,"output","log.txt"))

Serban Razvan
fonte
8
os.path.joinusa uma lógica mais complexa para combinar vários componentes de caminho relativo juntos. Quando você apenas deseja encadeá-los, os.sep.joiné a escolha certa.
Bachsau 08/12/19
108

Usar:

import os
print os.sep

para ver a aparência do separador em um sistema operacional atual.
No seu código, você pode usar:

import os
path = os.path.join('folder_name', 'file_name')
Alexander Kononenko
fonte
62

Você pode usar os.sep :

>>> import os
>>> os.sep
'/'
Adem Öztaş
fonte
39

os.path.normpath(pathname)também deve ser mencionado, pois converte /separadores de caminho em \separadores no Windows. Ele também entra em colapso referências de nível superior redundantes ... IE, A/Be A/foo/../Be A/./Btodos se tornam A/B. E se você é Windows, tudo isso se torna A\B.

Jon Rosen
fonte
3
Esta é a melhor resposta da OMI para a pergunta, como foi formulada: "como usar" / "(separador de diretório) no Linux e no Windows". E também é eminentemente útil - eu prefiro fazer do os.path.normpath('a/b/c/d/file.ext')que os.path.join('a','b','c','d','file.ext')quando precisar especificar um caminho longo.
ukrutt
Também achei esta resposta muito útil. Eu estava procurando um método para gerar caminhos com um separador consistente. O famoso os.path.joinapenas se junta a qualquer coisa fornecida. por exemplo, join("a/b", "c\d")a/b\c\d(no Windows). Mas eu posso obter o resultado esperado com a combinação adequada de joine normpath, por exemplo a\b\c\d(no Windows)
Sumudu
17

Se você tiver a sorte de executar o Python 3.4+, poderá usar pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

ou equivalente,

path = Path(dir) / subdir / filename
Eugene Yarmash
fonte
16

Alguns links úteis que ajudarão você:

Maroun
fonte
2
pathsep? Geralmente útil, mas não aqui, IMO.
glglgl
2
@glglgl De fato. Procurei sep, mas não pôde resistir-me a publicar este também (eu assumi o OP será encontrado é útil para o trabalho futuro) :)
Maroun
11

Faça um import ose depois useos.sep

JackPoint
fonte
8

Você pode usar " os.sep "

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)
P113305A009D8M
fonte
4

Não crie nomes de diretório e arquivo, use as bibliotecas incluídas do python.

Nesse caso, o relevante é os.path . Especialmente junção que cria um novo nome de caminho a partir de um diretório e um nome de arquivo ou diretório e divisão que obtém o nome do arquivo a partir de um caminho completo.

Seu exemplo seria

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
mmmmmm
fonte