2010-03-11 25 views
58

Ich versuche Python zu lernen und mache ein Programm, das ein Skript ausgeben wird. Ich möchte os.path.join verwenden, bin aber ziemlich verwirrt. Nach dem docs, wenn ich sage:Python os.path.join unter Windows

os.path.join('c:', 'sourcedir') 

I "C:sourcedir" bekommen. Laut den Unterlagen ist das normal, oder?

Aber wenn ich den copytree Befehl, Python ausgibt es die gewünschte Art und Weise, zum Beispiel:

import shutil 
src = os.path.join('c:', 'src') 
dst = os.path.join('c:', 'dst') 
shutil.copytree(src, dst) 

Hier ist der Fehlercode erhalte ich:

 
WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*' 

Wenn ich die os.path.join wickeln mit os.path.normpath bekomme ich den gleichen Fehler.

Wenn diese kann nicht auf diese Weise verwendet werden, dann bin ich verwirrt, was ihren Zweck betrifft.

Laut den Seiten von Stack Overflow empfohlen, sollten Schrägstriche nicht in Join — verwendet werden, die richtig ist, nehme ich an?

Antwort

33

Windows für jedes Laufwerk ein Konzept des aktuellen Verzeichnisses hat. Aus diesem Grund bedeutet "c:sourcedir" "sourcedir" im aktuellen C: -Verzeichnis, und Sie müssen ein absolutes Verzeichnis angeben.

Jede dieser soll das gleiche Ergebnis arbeiten und geben, aber ich habe nicht einen Windows-VM zur Zeit zu überprüfen feuerte:

"c:/sourcedir" 
os.path.join("/", "c:", "sourcedir") 
os.path.join("c:/", "sourcedir") 
+3

os.path.join ('C: /', 'sourcedir') funktionierte wie erwartet. ich danke Ihnen sehr guter Herr :) die anderen '//' 'c:' 'c: \\' nicht (C funktionierte: \\ erstellt zwei Schrägstriche, C: \ tat es nicht Arbeiten Sie überhaupt) Danke wieder ghostdog74, Smashery und Roger Pate. Ich bin in deiner Schuld :) –

+0

Sorry, Zeilenumbrüche wurden nicht in Kommentar gehalten, es sieht sehr chaotisch aus –

3

einen Windows-Pfad zu verbinden, versuchen

mypath=os.path.join('c:\\', 'sourcedir') 

im Grunde, müssen Sie den Schrägstrich

11

Der Grund arbeiten os.path.join('C:', 'src') ist nicht zu entkommen, wie Sie wegen etwas in der Dokumentation, die Sie verknüpft erwarten ist zu:

Beachten Sie, dass unter Windows, da es ein für jedes Laufwerk aktuelles Verzeichnis befindet, os.path.join ("c:", "foo") repräsentiert einen Pfad relativ zum aktuellen Verzeichnis auf Laufwerk C: (c: foo), nicht c: \ foo.

Wie ghostdog sagte, möchten Sie wahrscheinlich mypath=os.path.join('c:\\', 'sourcedir')

10

zu pedantisch sein, ist es wahrscheinlich nicht gut zu codieren Entweder/oder \ als Pfadtrennzeichen. Vielleicht wäre das das Beste?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir') 

oder

mypath = os.path.join('c:' + os.sep, 'sourcedir') 
73

noch pedantisch sein, die meisten Python-doc konsistente Antwort wäre:

mypath = os.path.join('c:', os.sep, 'sourcedir') 

Da Sie auch os benötigen.sep für den Posix-Root-Pfad:

mypath = os.path.join(os.sep, 'usr', 'lib') 
+2

Das ist die richtige Antwort. –

4

Ich würde sagen, das ist ein (Windows) Python-Bug.

Warum Fehler?

ich glaube, diese Aussage True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__)) 

sein sollte, aber es ist False auf Windows-Rechnern.

+1

Ich bin geneigt zuzustimmen, dass dies einen Python-Fehler darstellt. Ist das immer noch so? (_Geschrieben aus der glorreichen utopischen Zukunft von Ende 2015._) –

+0

Ich kann diese Frage in Bezug auf Windows nicht beantworten, da ich keinen Zugriff auf eine Windows-Maschine habe, aber ich denke, Pythons Verhalten bezüglich dieser Frage hat sich nicht geändert. Diese Anweisung gilt jedoch auch nicht für Linux-Implementierungen, da die erste Anweisung den Pfad ohne das führende Trennzeichen (a.k.a das Stammverzeichnis) zurückgibt, während die zweite Anweisung den Pfad mit dem führenden Trennzeichen zurückgibt. – georg

+0

Also mag ich meine Antwort zu dieser Frage eigentlich nicht mehr. Aber ich mag auch Pythons Verhalten diesbezüglich nicht. – georg

0

Zustimmung mit @ Georg-

würde ich dann sagen, warum brauchen wir lahm os.path.join - besser str.join oder unicode.join zu verwenden, z.B.

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep)) 
+0

Ja, richtig, es ist waaaaayy klarer so. Warum nicht Regexes verwenden, während Sie gerade dabei sind? oder rufen Sie ein Perl-Skript auf und verarbeiten Sie die Ausgabe? –

0

Sie haben einige mögliche Ansätze Pfad auf Windows, von den fest codierten diejenigen zu behandeln (als Ausgangs Stringliterale oder Flucht Schrägstriche verwenden) zu den Geringsten. Hier ein paar Beispiele, die wie erwartet funktionieren. Verwenden Sie, was besser Ihren Bedürfnissen entspricht.

In[1]: from os.path import join, isdir 

In[2]: from os import sep 

In[3]: isdir(join("c:", "\\", "Users")) 
Out[3]: True 

In[4]: isdir(join("c:", "/", "Users")) 
Out[4]: True 

In[5]: isdir(join("c:", sep, "Users")) 
Out[5]: True