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?


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


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


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.


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

16

Einige nützliche Links, die Ihnen helfen werden:


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


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)

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.