Caminho do Windows em Python

152

Qual é a melhor maneira de representar um diretório do Windows, por exemplo "C:\meshes\as"? Eu tenho tentado modificar um script, mas ele nunca funciona porque eu não consigo obter o diretório certo, eu suponho por causa da '\'atuação como caractere de escape?

Gareth
fonte

Respostas:

220

você pode usar sempre:

'C:/mydir'

isso funciona tanto no linux quanto no windows. Outra possibilidade é

'C:\\mydir'

se você tiver problemas com alguns nomes, também pode tentar literais de strings brutos:

r'C:\mydir'

no entanto, a melhor prática é usar as os.pathfunções do módulo que sempre selecionam a configuração correta para o seu sistema operacional:

os.path.join(mydir, myfile)

No python 3.4, você também pode usar o módulo pathlib . Isso é equivalente ao acima:

pathlib.Path(mydir, myfile)

ou

pathlib.Path(mydir) / myfile
joaquin
fonte
2
@Gareth, sou muito preguiçoso e frequentemente me vejo usando '/'. No entanto, a longo prazo, o uso do os.path é mais conveniente. Ele também permite que você use mydir e myfile como variáveis ​​que você pode modificar facilmente.
joaquin
13
A única coisa a ter cuidado com as seqüências de caracteres brutas é que elas não podem terminar com \
Douglas Leeder
Você pode usar os.path.join () para remover a necessidade de finalizar caminhos com \.
que você precisa
1
Eu gosto da sintaxe r (string não processada). Útil se você está copiando um longo caminho em que você normalmente tem que substituir todas as barras invertidas com barras
peterb
a sequência bruta pode terminar com \\ para que possamos concatenar um arquivo para o caminho: codecs.open (r "C: \ maXbox \ EKON24 \ tweet_data \\" + arquivo, 'r', codificação = 'utf-8') como f:
Max Kleiner
20

Use o os.pathmódulo

os.path.join( "C:", "meshes", "as" )

Ou use strings não processadas

r"C:\meshes\as"

Também não recomendaria espaços no caminho ou nos nomes dos arquivos. E você pode usar barras invertidas duplas em suas cordas.

"C:\\meshes\\as.jpg"
S.Lott
fonte
11
o os.path.join pode não se comportar conforme o esperado quando um componente é uma letra de unidade, pois os caminhos relativos são permitidos mesmo assim. (O resultado da primeira linha é 'C: \\ malhas como' no Windows.)
traço-tom-bang
O comentário de @ dash-tom-bang é realmente importante. É a coisa certa a fazer para colocar "C:\"como a primeira entrada? Isso atrapalha a limpeza do uso join?
Jack O'Connor
1
@ JackO'Connor é o que eu faço. Você certamente não deseja colocar "C:\"no meio do nome do arquivo. Além disso, você pode usar os.path.normpathantes ou depois de uma junção, para garantir que o caminho seja impresso corretamente.
Agostino
mas também não funciona. O que funciona éos.path.join( "C:\\", "meshes", "as" )
Jean-François Fabre
17

Sim, \em literais de cadeia de caracteres Python denota o início de uma sequência de escape. No seu caminho, você tem uma sequência de escape de dois caracteres válida \a, que é recolhida em um caractere que é ASCII Bell :

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess

Outras seqüências de escape comuns incluem \t(guia), \n(avanço de linha), \r(retorno de carro):

>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']

Como você pode ver, em todos esses exemplos, a barra invertida e o próximo caractere no literal foram agrupados para formar um único caractere na sequência final. A lista completa das seqüências de escape do Python está aqui .

Existem várias maneiras de lidar com isso:

  1. O Python não processará seqüências de escape em literais de string prefixados com rouR :

    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    
  2. O Python no Windows também deve manipular barras.

  3. Você poderia usar os.path.join...

    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
  4. ... ou o módulo mais recentepathlib

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
vaultah
fonte
-1

Use o PowerShell

No Windows, você pode usar /seu caminho como o Linux ou o macOS em todos os lugares , desde que você use o PowerShell como sua interface de linha de comando. Ele vem pré-instalado no Windows e suporta muitos comandos do Linux, como lscomando.

Se você usar o prompt de comando do Windows (aquele que aparece quando você digita cmdno menu Iniciar do Windows), precisa especificar os caminhos \apenas dentro dele. Você pode usar /caminhos em todos os outros lugares (editor de código, modo interativo Python, etc.).

Ammar Alyousfi
fonte
-1

Caso deseje colar o caminho do Windows de outra fonte (por exemplo, File Explorer) - você pode fazer isso por meio de input()chamada no console python:

>>> input()
D:\EP\stuff\1111\this_is_a_long_path\you_dont_want\to_type\or_edit_by_hand
'D:\\EP\\stuff\\1111\\this_is_a_long_path\\you_dont_want\\to_type\\or_edit_by_hand'

Em seguida, basta copiar o resultado

EP
fonte