Come usare “/” (separatore di directory) sia in Linux che in Windows in Python?


191

Ho scritto un codice in Python che usa / per creare un determinato file in una cartella, se voglio usare il codice in Windows non funzionerà, c'è un modo in cui posso usare il codice in Windows e Linux.

In Python sto usando questo codice:

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

Quando userò il mio codice supponiamo che il mio codice non funzionerà.

Come posso usare "/" (separatore di directory) sia in Linux che in Windows?


1
Puoi definirlo all'inizio a seconda di Win / * nix e quindi lavorare con la variabile.
fedorqui "SO smettere di danneggiare" il

12
In Windows puoi usare \ o / come separatore di directory.
SecurityMatt

12
Windows supporta i /percorsi di directory. Che problema specifico stai riscontrando? Pubblica del codice che illustri il problema.
Michael Geary,

A meno che tu non dipenda da programmi per utenti di Windows, la barra in avanti funziona come anche all'indietro. Alcuni comandi cmd hanno comunque dei problemi.
Pihhan,

1
@Mehrdad: conosci un esempio per il quale l'API Win32 non accetta '/'? (senza contare cmd.exe e altri programmi)
Eryk Sun

Risposte:


268

Usa os.path.join(). Esempio: os.path.join(pathfile,"output","log.txt").

Nel tuo codice sarebbe: rootTree.write(os.path.join(pathfile,"output","log.txt"))


9
os.path.joinutilizza una logica più complessa per abbinare insieme diversi componenti del percorso relativo. Quando vuoi semplicemente incatenarli, os.sep.joinè la scelta giusta.
Bachsau,

108

Uso:

import os
print os.sep

per vedere come appare il separatore su un sistema operativo corrente.
Nel tuo codice puoi usare:

import os
path = os.path.join('folder_name', 'file_name')


39

os.path.normpath(pathname)dovrebbe anche essere menzionato in quanto converte i /separatori di percorso in \separatori su Windows. E crolla anche i riferimenti di livello superiore ridondanti ... vale a dire, A/Be A/foo/../Be A/./Btutti diventano A/B. E se sei Windows, diventano tutti A\B.


3
Questa è l'IMO la migliore risposta alla domanda così come è stata formulata, "come usare" / "(separatore di directory) sia in Linux che in Windows". Ed è anche estremamente utile: preferirei di gran lunga fare os.path.normpath('a/b/c/d/file.ext')rispetto a os.path.join('a','b','c','d','file.ext')quando devo specificare un lungo percorso.
ukrutt,

Ho anche trovato questa risposta molto utile. Stavo cercando un metodo per generare percorsi con un separatore coerente. Il famoso si os.path.joinunisce a tutto ciò che viene fornito. es. join("a/b", "c\d")a/b\c\d(su windows). Ma posso ottenere il risultato atteso con la giusta combinazione di joine normpath, ad esempio a\b\c\d(su Windows)
Sumudu,

17

Se sei abbastanza fortunato da eseguire Python 3.4+, puoi usare pathlib:

from pathlib import Path

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

o, equivalentemente,

path = Path(dir) / subdir / filename

16

Alcuni link utili che ti aiuteranno:


2
pathsep? Generalmente utile, ma non qui, IMO.
glglgl,

2
@glglgl Effettivamente. Ho cercato sepma non ho potuto resistere a pubblicare anche questo (ho pensato che l'OP lo avrebbe trovato utile per lavori futuri) :)
Maroun,


8

Puoi usare " os.sep "

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

4

Non creare nomi di directory e file da soli, utilizzare le librerie incluse di Python.

In questo caso quello rilevante è os.path . Soprattutto join che crea un nuovo percorso da una directory e un nome file o directory e si divide che ottiene il nome file da un percorso completo.

Il tuo esempio sarebbe

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.