Frage

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

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

ich "C:sourcedir". Nach der Dokumentation, das ist normal, nicht wahr?

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 wird der Fehlercode erhalte ich:

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

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

Wenn diese os.path.join nicht auf diese Weise verwendet werden kann, dann bin ich verwirrt, seinen Zweck erfüllt.

Nach den Seiten von Stack-Überlauf vorgeschlagen, Schrägstriche verwendet werden, sollten nicht in fugen das ist richtig, nehme ich an?

War es hilfreich?

Lösung

Windows verfügt über ein Konzept des aktuellen Verzeichnisses für jedes Laufwerk. Aus diesem Grunde bedeutet "c:sourcedir" „sourcedir“ innerhalb des aktuellen C: Verzeichnis, und Sie werden ein absolutes Verzeichnis angeben müssen

.

Jedes dieser Programme sollte das gleiche Ergebnis arbeiten und geben, aber ich habe keine Windows VM zur Zeit zu überprüfen feuert:

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

Andere Tipps

Um noch mehr pedantisch, die Python-doc konsistente Antwort wäre:

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

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

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

Der Grund os.path.join('C:', 'src') nicht so funktioniert, wie Sie wegen etwas in der Dokumentation, die Sie verknüpfen erwarten ist:

  

Beachten Sie, dass unter Windows, da es eine ist   aktuelles Verzeichnis für jedes Laufwerk,   os.path.join ( "C:", "foo") stellt eine   Pfad relativ zum aktuellen Verzeichnis   auf Laufwerk C: (C: foo), nicht. C: \ foo

Wie ghostdog sagte, werden Sie wahrscheinlich mypath=os.path.join('c:\\', 'sourcedir') wollen

Um pedantisch, ist es wahrscheinlich auch nicht gut / oder \ als Pfadtrenn zu codieren. Vielleicht wäre dies am besten?

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

oder

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

Ich würde sagen, das ist ein (Fenster) Python Fehler.

Warum Bug?

Ich denke, diese Aussage True werden soll

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

Aber es ist False auf Windows-Rechnern.

Für eine systemunabhängige Lösung, die auf Windows und Linux funktioniert, egal, was der Eingangspfad, könnte man os.path.join(os.sep, rootdir + os.sep, targetdir) verwenden

Unter Windows:

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

Unter Linux:

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'

einen Windows-Pfad zu verbinden, versuchen

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

im Grunde, müssen Sie den Schrägstrich entkommen

Sie haben einige mögliche Ansätze Pfad auf Windows zu behandeln, von den fest codierten Einsen (als Ausgangs Stringliterale mit oder Schrägstriche zu entkommen) zu den Geringsten. Hier folgt ein paar Beispiele, die wie erwartet funktioniert. 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

Die Zustimmung mit @georg -

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

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top