Ich versuche Python zu lernen und mache ein Programm, das ein Skript ausgibt. Ich möchte os.path.join verwenden, bin aber ziemlich verwirrt. Laut den Dokumenten, wenn ich sage:
os.path.join('c:', 'sourcedir')
Ich verstehe "C:sourcedir"
. Laut den Dokumenten ist das normal, oder?
Wenn ich den Befehl copytree verwende, gibt Python ihn auf die gewünschte Weise aus, zum Beispiel:
import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)
Hier ist der Fehlercode, den ich bekomme:
WindowsError: [Fehler 3] Das System kann den angegebenen Pfad nicht finden: 'C: src /*.*'
Wenn ich das os.path.join
mit os.path.normpath
einpacke, bekomme ich den gleichen Fehler.
Wenn dies os.path.join
nicht auf diese Weise verwendet werden kann, bin ich hinsichtlich seines Zwecks verwirrt.
Laut den von Stack Overflow vorgeschlagenen Seiten sollten beim Join keine Schrägstriche verwendet werden - das ist richtig, nehme ich an?
quelle
os.path.join
oderos.sep
ob Sie esc:
trotzdem angeben wollen?c:
macht auf anderen Betriebssystemen keinen Sinn.os.path.join('c:','folder')
funktioniert dies anders alsos.path.join('folder','file')
? Liegt es an der:
oder weil 'c: `ein Laufwerk ist?Um noch pedantischer zu sein, wäre die konsistenteste Antwort von Python Doc:
Da Sie auch os.sep für den Posix-Root-Pfad benötigen:
quelle
os.sep
überlegen?os.sep
. Es funktioniert nur nach dem bloßen Laufwerksbuchstaben. >>> os.path.join ("C: \ goodbye", os.sep, "temp") 'C: \\ temp'os.sep
ist nützlich, wenn Sie Pfade bearbeiten möchten, ohne Annahmen über das Trennzeichen zu treffen. Es ist sinnlos, es zu verwenden,os.path.join()
da es bereits das richtige Trennzeichen kennt. Es ist auch sinnlos, wenn Sie das Stammverzeichnis explizit nach Namen angeben müssen (wie Sie in Ihrem eigenen Beispiel sehen können). Warum"c:" + os.sep
statt einfach"c:\\"
oderos.sep + "usr"
statt einfach"/usr"
? Beachten Sie auch, dass Sie in Win-Shells nichtcd c:
könnencd c:\
, aber Sie können , was darauf hindeutet, dass der Stammname tatsächlich lautetc:\
.Der Grund dafür,
os.path.join('C:', 'src')
dass Sie nicht wie erwartet funktionieren, liegt in der Dokumentation, auf die Sie verlinkt haben:Wie Ghostdog sagte, möchten Sie wahrscheinlich
mypath=os.path.join('c:\\', 'sourcedir')
quelle
Um pedantisch zu sein, ist es wahrscheinlich nicht gut, entweder / oder \ als Pfadtrennzeichen fest zu codieren. Vielleicht wäre das am besten?
oder
quelle
Für eine systemunabhängige Lösung, die sowohl unter Windows als auch unter Linux funktioniert, unabhängig vom Eingabepfad, könnte man sie verwenden
os.path.join(os.sep, rootdir + os.sep, targetdir)
Auf Fenstern:
Unter Linux:
quelle
c:
existiert nicht auf * nix undusr
existiert nicht unter Windows ..os.path.join(os.sep, rootdir + os.sep, targetdir)
ist systemunabhängig, gerade weil er mit diesen beiden systemspezifischen Beispielen funktioniert, ohne dass der Code geändert werden muss.rootdir = "usr" if nix else "c:"
. Aber das direktere und genauererootdir = "/usr" if nix else "c:\\"
funktioniert genauso gut, ohne dieos.sep
Akrobatik und das daraus resultierende Kopfkratzen. Es besteht keine Gefahr , dass ein Root - Verzeichnis auf * nichts mit etwas anderes als ein Schrägstrich beginnen wird, oder dass Windows Stammverzeichnisse ohne Hinter Kolon und Backslash (zB in Win Schalen genannt haben, können Sie nicht einfach tuncd c:
, würden Sie müssen den nachfolgenden Backslash angeben), warum also etwas anderes vorgeben?Ich würde sagen, dies ist ein (Windows-) Python-Fehler.
Warum Fehler?
Ich denke, diese Aussage sollte sein
True
Aber es ist
False
auf Windows-Maschinen.quelle
Versuchen Sie es mit einem Windows-Pfad
Grundsätzlich müssen Sie dem Schrägstrich entkommen
quelle
Sie haben einige mögliche Ansätze, um Pfade unter Windows zu behandeln, von den am festesten codierten (wie die Verwendung von rohen String-Literalen oder das Entkommen von Backslashes) bis zu den kleinsten. Hier einige Beispiele, die wie erwartet funktionieren. Verwenden Sie, was Ihren Anforderungen besser entspricht.
quelle
Zustimmung zu @ georg-
Ich würde dann sagen, warum wir lahm brauchen
os.path.join
- besser zu benutzenstr.join
oderunicode.join
zBquelle
Antwort auf Ihren Kommentar: "Die anderen '//' 'c:', 'c: \\' haben nicht funktioniert (C: \\ hat zwei Backslashes erstellt, C: \ hat überhaupt nicht funktioniert)"
Unter Windows
os.path.join('c:', 'sourcedir')
werden automatisch zwei Backslashes\\
vor dem Sourcing-Verzeichnis hinzugefügt .Um den Pfad zu beheben, wie Python auf Windows auch mit Schrägstrichen arbeitet -> ‚/‘ , fügen Sie einfach
.replace('\\','/')
mitos.path.join
wie folgt: -os.path.join('c:\\', 'sourcedir').replace('\\','/')
z.B:
os.path.join('c:\\', 'temp').replace('\\','/')
Ausgabe: 'C: / temp'
quelle
Die vorgeschlagenen Lösungen sind interessant und bieten eine gute Referenz, sind jedoch nur teilweise zufriedenstellend. Es ist in Ordnung, das Trennzeichen manuell hinzuzufügen, wenn Sie einen bestimmten Fall haben oder das Format der Eingabezeichenfolge kennen. Es kann jedoch Fälle geben, in denen Sie dies programmgesteuert für generische Eingaben tun möchten.
Mit ein wenig Experimentieren glaube ich, dass das Kriterium darin besteht, dass der Pfadbegrenzer nicht hinzugefügt wird, wenn das erste Segment ein Laufwerksbuchstabe ist, dh ein einzelner Buchstabe, gefolgt von einem Doppelpunkt, unabhängig davon, ob er einer realen Einheit entspricht.
Beispielsweise:
Eine bequeme Möglichkeit, die Kriterien zu testen und eine Pfadkorrektur anzuwenden, besteht darin
os.path.splitdrive
, das erste zurückgegebene Element mit dem Testwert zu vergleichen, zt+os.path.sep if os.path.splitdrive(t)[0]==t else t
.Prüfung:
Es kann wahrscheinlich verbessert werden, um für nachfolgende Leerzeichen robuster zu sein, und ich habe es nur unter Windows getestet, aber ich hoffe, es gibt eine Idee. Siehe auch Os.path: Können Sie dieses Verhalten erklären? für interessante Details zu anderen Systemen als Windows.
quelle