412 Stimmen

Warum funktioniert os.path.join() in diesem Fall nicht?

Der nachstehende Code wird nicht zusammengefügt, da der Befehl beim Debuggen nicht den gesamten Pfad, sondern nur den letzten Eintrag speichert.

os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')

Wenn ich dies teste, wird nur die /new_sandbox/ Teil des Codes.

1voto

Goblinhack Punkte 2483
os.path.join("a", *"/b".split(os.sep))
'a/b'

eine ausführlichere Version:

import os

def join (p, f, sep = os.sep):
    f = os.path.normpath(f)
    if p == "":
        return (f);
    else:
        p = os.path.normpath(p)
        return (os.path.join(p, *f.split(os.sep)))

def test (p, f, sep = os.sep):
    print("os.path.join({}, {}) => {}".format(p, f, os.path.join(p, f)))
    print("        join({}, {}) => {}".format(p, f, join(p, f, sep)))

if __name__ == "__main__":
    # /a/b/c for all
    test("\\a\\b", "\\c", "\\") # optionally pass in the sep you are using locally
    test("/a/b", "/c", "/")
    test("/a/b", "c")
    test("/a/b/", "c")
    test("", "/c")
    test("", "c")

0voto

shacker Punkte 13440

Beachten Sie, dass ein ähnliches Problem auftauchen kann, wenn Sie os.path.join() um eine Erweiterung einzuschließen, die bereits einen Punkt enthält, was automatisch geschieht, wenn Sie os.path.splitext() . In diesem Beispiel:

components = os.path.splitext(filename)
prefix = components[0]
extension = components[1]
return os.path.join("avatars", instance.username, prefix, extension)

Auch wenn extension sein könnte .jpg haben Sie am Ende einen Ordner mit dem Namen "foobar" und nicht eine Datei mit dem Namen "foobar.jpg". Um dies zu verhindern, müssen Sie die Erweiterung separat anhängen:

return os.path.join("avatars", instance.username, prefix) + extension

0voto

suhailvs Punkte 17111

Können Sie strip その '/' :

>>> os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/'.strip('/'))
'/home/build/test/sandboxes/04122019/new_sandbox'

0voto

Trọng Nhân Punkte 33

Das Problem ist, dass auf Ihrem Laptop vielleicht Windows läuft. Und Windows verwendet ärgerlicherweise den Backlash anstelle des Schrägstrichs '/'.
Um Ihr Programm plattformübergreifend zu machen (Linux/Windows/etc). Sie sollten keine Schrägstriche (vorwärts oder rückwärts) in Ihrem Pfad angeben, wenn Sie os.path.join um sie richtig zu behandeln. sollten Sie verwenden:

os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')

Oder werfen Sie ein paar Path(__file__).resolve().parent (Pfad zur übergeordneten Datei der aktuellen Datei) oder etwas anderes, so dass Sie keinen Schrägstrich innerhalb von os.path.join

-1voto

Dr Fabio Gori Punkte 898

Ich würde empfehlen, aus dem zweiten und den folgenden Strings die Zeichenfolge os.path.sep und verhindert, dass sie als absolute Pfade interpretiert werden:

first_path_str = '/home/build/test/sandboxes/'
original_other_path_to_append_ls = [todaystr, '/new_sandbox/']
other_path_to_append_ls = [
    i_path.strip(os.path.sep) for i_path in original_other_path_to_append_ls
]
output_path = os.path.join(first_path_str, *other_path_to_append_ls)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X