2013-05-02 11 views
32

Ich neige dazu, nur nach vorne verwenden Schrägstriche für Pfade (‚/‘) und Python ist damit auch auf Windows glücklich. In der Beschreibung von os.path.join heißt es, dass das der richtige Weg ist, wenn Sie plattformübergreifend gehen wollen. Aber wenn ich es verwende, bekomme ich gemischte Schrägstriche:gemischte Schrägstriche mit os.path.join an Fenstern

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 korrekt? Soll ich es nachher überprüfen und korrigieren oder gibt es einen besseren Weg?

Dank

EDIT: ich gemischte Hiebe bekommen auch wenn für Wege

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 
+0

'os' ist schlau und funktioniert, welche Schrägstriche Sie für Ihr Betriebssystem benötigen. Um es korrekt zu verwenden, setzen Sie keine Schrägstriche in die Strings a, b, c, d und e - os fügt sie hinzu. – ejrb

+1

Ich sehe, aber was ist, wenn ich gemischte Schrägstriche bekomme, wenn ich nach einem Pfad frage? (Ich habe den ersten Beitrag mit einem Beispiel aktualisiert) – nookie

+2

Sie können 'os.path.normpath (mixed_slashes_path)' verwenden und die Schrägstriche normalisiert bekommen. Oh, und ich vermute, du machst das in Maya; Es macht Dinge sehr UNIX-ähnlich, daher die Schrägstriche in den Pfaden, die es für dich hinzufügt. –

Antwort

18

Sie bieten nun einige der Schrägstriche selbst und lassen os.path.join andere holen. Es ist besser, Python alle auswählen oder selbst bereitstellen zu lassen. Python verwendet Backslashes für den letzten Teil des Pfades, da Backslashes die Standardeinstellung für Windows sind.

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 dies nicht getestet, aber ich hoffe, das hilft. Es ist üblicher, einen Basispfad zu haben und nur ein anderes Element, meistens Dateien, zu verbinden.

Übrigens; Sie können os.sep für die Momente verwenden, in denen Sie das beste Trennzeichen für das Betriebssystem haben möchten, auf dem Python läuft.

Bearbeiten: als Dash-Tom-Bang-Status, offenbar für Windows müssen Sie ein Trennzeichen für die Wurzel des Pfades enthalten. Andernfalls erstellen Sie einen relativen Pfad anstelle eines absoluten.

+0

Danke für Ihre Antwort, aber was passiert, wenn ich Schrägstriche in einer Zeichenfolge (wenn zwei oder mehr Ordner) haben? Ich habe den ersten Post mit einigen Pfaden aktualisiert, die ich von sys.path – nookie

+0

erhalte, hängt davon ab, woher dieser Pfad kommt. Aber meistens sollten Sie diese Schrägstriche bereits im richtigen Format haben. Das heißt, wenn Sie den Pfad durch Python erhalten. Wenn Sie eine externe Quelle haben, die Sie nicht kontrollieren, und diese Quelle bietet Vorwärts-Schrägstriche anstelle von Rückwärts-Schrägstrichen; Vielleicht möchten Sie das zuerst beheben. – pyrocumulus

+0

Also sollte ich die Zeichenfolge danach überprüfen und sicherstellen, dass das Format korrekt ist? – nookie

2

os fügt Schrägstriche für Sie und sorgt dafür, dass nicht zu duplizieren Schrägstriche so weglassen sie in die Saiten

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 
fragen

Zusätzlich:

Ich bin nicht sicher, warum Sie Schrägstriche in Ihrem sys Pfad gemischt haben (haben Sie ein Linux-Betriebssystem verwendet, um einige Ordner hinzufügen?), Aber versuchen

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

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

So oder so würde ich vermeiden, hart codierte Verzeichnisnamen in Ihrem Programm. Ihre sys.path for-Schleife ist eine sichere Möglichkeit, diese Verzeichnisse herauszuziehen. Sie können dann einige String-Methoden oder Regex verwenden, um den gewünschten Ordner auszuwählen.

+0

os.path.isdir (os.path.join ('C:', 'Benutzer', 'nookie')) gibt False zurück. Ich habe keine Linux Os verwendet, um meine Ordner hinzuzufügen, diese kamen nur von der Software-Installation! – nookie

+1

Welche Version von Python verwenden Sie, @ejrb? Weil auf meiner, ich nicht den ersten Schrägstrich bekommen. (Ich sehe 'C: myFirstDirectory \ mySecondDirectory ...') –

22

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

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

Das gibt:

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

Als @sharpcloud vorgeschlagen, wäre es besser, die Schrägstriche zu entfernen Ihre Eingabe-Strings, aber dies ist eine Alternative.

+4

Wäre es besser, nur posixpath anstelle von os.path zu importieren und dann 'posixpath.join (a, b, c, d, e)' zu verwenden, was Ihnen immer Schrägstriche liefert. – semicolon

+0

@semicolon, ist posixpath nicht der selbe wie os.path? Auf meinem Windows-Rechner gibt 'posixpath.join()' immer noch gemischte Schrägstriche zurück. – Maximus

+0

Wenn Sie [hier] (https://docs.python.org/2/library/os.path.html) suchen, importiert os.path basierend auf Ihrem Betriebssystem einen von posixpath, ntpath, macpath oder os2emxpath. Ich bin überrascht, dass Sie immer noch gemischte Schrägstriche mit Posixpath bekommen. Ich habe es gerade auf einer Windows-Maschine getestet und 'os.path.join ('foo', 'bar')' gab mir '' a'b''und 'posixpath.join ('foo', 'bar')' gab mir "A/B". – semicolon

1
  • Konvertieren Sie zuerst den Pfad in ein Array von Ordnern und Dateinamen.
  • Zweitens, kleben Sie sie wieder zusammen mit dem richtigen Symbol.

    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) 
    
+3

Beachten Sie, dass diese Methode bricht, wenn Ihre Zeichenfolge "\" verwendet, um Leerzeichen in Ordnern zu vermeiden. Zum Beispiel wird '"/usr/my \ files "' zu '" usr "," my "," files "' anstelle von '" usr "," my files "' übersetzen – oriadam

4

versuchen abspath verwenden (mit 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))) 

OUTPUT:

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

Prozess abgeschlossen mit Ausgangscode 0

0

Wenn aus irgendeinem Grund Sie die Pfade selbst zur Verfügung stellen müssen, und Sie haben mit etwas über Python 3.4 Sie pathlib

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 benutzten verwenden können, wenn ich einen Benutzer erforderlich, um die Position eines Assets-Verzeichnis zur Verfügung zu stellen und meine Code sah nach oben mit Windows Pfad Zeichenfolgen

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')