it-swarm.com.de

gemischte Schrägstriche mit os.path.join unter Windows

Ich neige dazu, nur Schrägstriche für Pfade ('/') zu verwenden und python ist damit auch unter Windows zufrieden. In der Beschreibung von os.path.join heißt es, dass dies der richtige Weg ist, wenn du willst plattformübergreifend sein, aber wenn ich es benutze, bekomme ich gemischte Schrägstriche:

import os

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'


print os.path.join(a, b, c, d, e)

# Result:
c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe

Ist das richtig? Sollte ich es später überprüfen und korrigieren oder gibt es einen besseren Weg?

Vielen Dank

EDIT: Ich bekomme auch gemischte Schrägstriche, wenn ich nach Pfaden frage

import sys
for item in sys.path:
    print item

# Result:
C:\Program Files\Autodesk\Maya2013.5\bin
C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates
C:\Program Files\Autodesk\Maya2013.5\Python
C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages
C:\Program Files\Autodesk\Maya2013.5\bin\python26.Zip\lib-tk
C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts
C:/Users/nookie/Documents/maya/2013.5-x64/scripts
C:/Users/nookie/Documents/maya/scripts
C:\Program Files\Nuke7.0v4\lib\site-packages
C:\Program Files\Nuke7.0v4/plugins/modules
51
nookie

Du gibst jetzt selbst einige Schrägstriche ein und lässt os.path.join andere auswählen. Es ist besser, python alle auswählen zu lassen oder alle selbst bereitzustellen. Python verwendet Backslashes für den letzten Teil des Pfads, da Backslashes die Standardeinstellung sind Windows.

import os

a = 'c:' # removed slash
b = 'myFirstDirectory' # removed slash
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a + os.sep, b, c, d, e)

Ich habe das noch nicht getestet, aber ich hoffe, das hilft. Es ist üblicher, einen Basispfad zu haben und nur ein anderes Element, meistens Dateien, zu verknüpfen.

Apropos; Sie können os.sep für die Momente, in denen Sie das beste Trennzeichen für das Betriebssystem haben möchten python läuft auf.

Bearbeiten: Wie Dash-Tom-Bang-Status angibt, müssen Sie für Windows anscheinend ein Trennzeichen für die Wurzel des Pfads einfügen. Andernfalls erstellen Sie einen relativen Pfad anstelle eines absoluten.

29
pyrocumulus

Sie können .replace() nach path.join() verwenden, um sicherzustellen, dass die Schrägstriche korrekt sind:

# .replace() all backslashes with forwardslashes
print os.path.join(a, b, c, d, e).replace("\\","/")

Dies ergibt die Ausgabe:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

Wie @sharpcloud vorgeschlagen hat, ist es besser, die Schrägstriche aus den Eingabezeichenfolgen zu entfernen. Dies ist jedoch eine Alternative.

34
Maximus

versuche es mit abspath (benutze python 3)

import os

a = 'c:/'
b = 'myFirstDirectory/'
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'


print(os.path.abspath(os.path.join(a, b, c, d, e)))

AUSGABE:

c:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

Vorgang mit Exit-Code 0 beendet

10
Andre Odendaal

BEARBEITEN basierend auf Kommentar:path = os.path.normpath(path)

Meiner vorherigen Antwort mangelt es an der Fähigkeit, mit Escape-Zeichen umzugehen, und daher sollte nicht verwendet werden:

  • Konvertieren Sie zunächst den Pfad in ein Array mit Ordnern und Dateinamen.
  • Zweitens kleben Sie sie mit dem richtigen Symbol wieder zusammen.

    import os   
    path = 'c:\www\app\my/folder/file.php'
    # split the path to parts by either slash symbol:
    path = re.compile(r"[\/]").split(path)
    # join the path using the correct slash symbol:
    path = os.path.join(*path)
    
8
oriadam

Wenn Sie aus irgendeinem Grund die Pfade selbst angeben müssen und etwas über python 3.4 verwenden, können Sie pathlib verwenden

from pathlib import Path, PurePosixPath

a = PurePosixPath('c:/')
b = PurePosixPath('myFirstDirectory/')
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print(a / b / c / d / e)

# Result
c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

Ich habe dies verwendet, als ein Benutzer den Speicherort eines Assets-Verzeichnisses angeben musste und mein Code mithilfe von Windows-Pfadzeichenfolgen nachgeschlagen wurde

In [1]: from pathlib import Path, PureWindowsPath
In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable
In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')
In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET

Out[4]: PosixPath('/asset/dir/some/asset')
2
dinosaurwaltz

os fügt Schrägstriche für Sie hinzu und stellt sicher, dass Sie keine Schrägstriche duplizieren. Lassen Sie sie daher in Ihren Zeichenfolgen weg

import os

# Don't add your own slashes
a = 'C:'
b = 'myFirstDirectory' 
c = 'mySecondDirectory'
d = 'myThirdDirectory'
e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)
C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

zusätzlich:

Ich bin nicht sicher, warum Sie in Ihrem Sys-Pfad gemischte Schrägstriche haben (haben Sie ein Linux-Betriebssystem verwendet, um einige Ordner hinzuzufügen?), Aber versuchen Sie es zu überprüfen

print os.path.isdir(os.path.join('C:','Users','nookie')).

Wenn dies True ist, dann funktioniert os für Ihre gemischten Schrägstriche.

In jedem Fall würde ich vermeiden, Verzeichnisnamen in Ihrem Programm fest zu codieren. Ihre sys.path For-Schleife ist eine sichere Möglichkeit, diese Verzeichnisse abzurufen. Sie können dann einige Zeichenfolgemethoden oder Regex verwenden, um den gewünschten Ordner auszuwählen.

2
ejrb