Sto scrivendo uno script per analizzare più file di registro e mantenere un elenco dei file che sono stati elaborati. Quando ho letto la lista dei file da elaborare Io uso os.walk
e ottenere nomi simili al seguente:Python - Can (o should) I change os.path.sep?
C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log
Questo viene creato il seguente codice:
filesToProcess.extend(os.path.join(root, filename) for filename in filenames if logFilePatternMatch.match(filename))
Sembra che "root" utilizzato in avanti barra come separatore (sono su Windows e lo trovo più comodo), ma "nomefile" usa i backslash e quindi finisco con un percorso incoerente per il file poiché contiene una combinazione di barre avanti e indietro come separatori.
Ho provato a fissare il separatore con:
os.path.sep = "/"
e
os.sep = "/"
Prima .join ma sembra non avere effetto. Mi rendo conto che in teoria potrei manipolare la stringa ma a lungo termine vorrei che il mio script potesse girare su Unix e Windows, quindi preferirei che fosse dinamico se possibile.
Mi manca qualcosa?
Aggiornamento:
In base alle risposte utili di seguito sembra che il mio problema era auto inflitta, per comodità avevo impostare il percorso iniziale utilizzato come root in questo modo:
logFileFolder = ['C:/Users/Python/Documents/Logs']
Quando ho cambiato a questo:
logFileFolder = ['C:\\Users\\Python\\Documents\\Logs']
tutto funziona ed i miei percorsi dei file risultanti tutti utilizzare il "\" in tutto. Sembra che il mio approccio fosse sbagliato in quanto stavo cercando di far sì che Python cambiasse comportamento piuttosto che correggere quello che stavo impostando come valore.
Grazie!
andrò su un arto e dire che l'impostazione 'os.sep' non è probabilmente il diritto soluzione. –
possibile duplicato di [Perché non os.path.join utilizzare os.path.sep o os.sep?] (Http://stackoverflow.com/questions/12086224/why-not-os-path-join-use-os -path-sep-or-os-sep) – BrenBarn
Come anser per quella domanda duplicata, 'os.path' funziona importando' posixpath' o 'ntpath' a seconda del sistema operativo. È interessante notare che nel codice sorgente di questi moduli è possibile vedere che il separatore di percorso è hard-coded come stringa letterale all'interno della funzione 'join', quindi non sarà possibile cambiarlo senza scrivere la propria funzione' join'. – BrenBarn