Wie verwende ich "/" (Verzeichnis-Trennzeichen) unter Linux und Windows in Python?

191

Ich habe einen Code in Python geschrieben, der / verwendet, um eine bestimmte Datei in einem Ordner zu erstellen. Wenn ich den Code in Windows verwenden möchte, funktioniert er nicht. Gibt es eine Möglichkeit, den Code in Windows und Linux zu verwenden?

In Python verwende ich diesen Code:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Wenn ich meinen Code in einem Windows-Computer verwende, funktioniert mein Code nicht.

Wie verwende ich "/" (Verzeichnis-Trennzeichen) unter Linux und Windows?

hulk007
quelle
1
Sie können es am Anfang abhängig von Win / * nix definieren und dann mit der Variablen arbeiten.
Fedorqui 'SO hör auf zu schaden'
12
In Windows können Sie entweder \ oder / als Verzeichnistrennzeichen verwenden.
SecurityMatt
12
Windows unterstützt /in Verzeichnispfaden. Welches spezifische Problem haben Sie? Veröffentlichen Sie einen Code, der das Problem veranschaulicht.
Michael Geary
Sofern Sie nicht von Windows Userspace-Programmen abhängig sind, funktioniert der Schrägstrich sowohl vorwärts als auch rückwärts. Einige cmd-Befehle haben jedoch Probleme damit.
Pihhan
1
@Mehrdad: Kennen Sie ein Beispiel, für das die Win32-API '/' nicht akzeptiert? (ohne cmd.exe und andere Programme)
Eryk Sun

Antworten:

266

Verwenden Sie os.path.join(). Beispiel : os.path.join(pathfile,"output","log.txt").

In Ihrem Code wäre das: rootTree.write(os.path.join(pathfile,"output","log.txt"))

Serban Razvan
quelle
8
os.path.joinverwendet eine komplexere Logik, um mehrere relative Pfadkomponenten miteinander abzugleichen. Wenn Sie sie nur verketten möchten, os.sep.joinist dies die richtige Wahl.
Bachsau
108

Verwenden:

import os
print os.sep

um zu sehen, wie Separator auf einem aktuellen Betriebssystem aussieht.
In Ihrem Code können Sie verwenden:

import os
path = os.path.join('folder_name', 'file_name')
Alexander Kononenko
quelle
38

os.path.normpath(pathname)sollte auch erwähnt werden, da es unter Windows /Pfadtrennzeichen in \Trennzeichen konvertiert . Es bricht auch redundante uplevel Referenzen ... also A/Bund A/foo/../Bund A/./Balle werden A/B. Und wenn Sie Windows sind, werden diese alle A\B.

Jon Rosen
quelle
3
Dies ist IMO die beste Antwort auf die Frage, wie sie formuliert wurde: "Wie wird" / "(Verzeichnis-Trennzeichen) sowohl unter Linux als auch unter Windows verwendet?". Und es ist auch äußerst nützlich - ich würde es viel lieber tun, os.path.normpath('a/b/c/d/file.ext')als os.path.join('a','b','c','d','file.ext')wenn ich einen langen Pfad angeben muss.
Ukrutt
Ich fand diese Antwort auch sehr hilfreich. Ich suchte nach einer Methode zum Generieren von Pfaden mit einem konsistenten Trennzeichen. Der Berühmte verbindet os.path.joineinfach alles, was zur Verfügung gestellt wird. zB join("a/b", "c\d")gibt a/b\c\d(auf Windows). Aber ich kann das erwartete Ergebnis mit der richtigen Kombination von joinund normpath, z. B. a\b\c\d(unter Windows)
Sumudu
17

Wenn Sie das Glück haben, Python 3.4+ auszuführen, können Sie Folgendes verwenden pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

oder gleichwertig,

path = Path(dir) / subdir / filename
Eugene Yarmash
quelle
16

Einige nützliche Links, die Ihnen helfen werden:

Maroun
quelle
2
Pfadsep? Allgemein nützlich, aber nicht hier, IMO.
glglgl
2
@glglgl In der Tat. Ich habe gesucht sep, konnte mich aber nicht dagegen wehren, dies auch zu posten (ich nahm an, dass das OP es für zukünftige Arbeiten nützlich finden wird) :)
Maroun
11

Mach ein import osund benutze dannos.sep

JackPoint
quelle
8

Sie können " os.sep " verwenden

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)
P113305A009D8M
quelle
4

Erstellen Sie keine Verzeichnis- und Dateinamen selbst, sondern verwenden Sie die in Python enthaltenen Bibliotheken.

In diesem Fall ist os.path relevant . Insbesondere Join, der einen neuen Pfadnamen aus einem Verzeichnis und einem Dateinamen oder Verzeichnis erstellt und aufteilt, der den Dateinamen von einem vollständigen Pfad erhält.

Ihr Beispiel wäre

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
mmmmmm
quelle