Jak podzielić ścieżkę DOS na jej komponenty w Pythonie

153

Mam zmienną typu string, która reprezentuje ścieżkę dos np:

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Chcę podzielić ten ciąg na:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

Próbowałem użyć split()i replace()ale albo przetwarzają tylko pierwszy lewy ukośnik, albo wstawiają liczby szesnastkowe do ciągu.

Muszę jakoś przekonwertować tę zmienną łańcuchową na nieprzetworzony ciąg, aby móc ją przeanalizować.

Jak najlepiej to zrobić?

Powinienem również dodać, że zawartość varnp. Ścieżki, którą próbuję przeanalizować, jest w rzeczywistości wartością zwracaną przez zapytanie w wierszu poleceń. To nie dane o ścieżkach, które sam generuję. Jest przechowywany w pliku, a narzędzie wiersza poleceń nie ucieknie przed ukośnikami odwrotnymi.

BeeBand
źródło
6
Przeglądając te odpowiedzi, pamiętaj, że os.path.splitto nie działa, ponieważ nie unikasz poprawnie tego ciągu.
Jed Smith
Musisz uciec od ciągu lub użyć nieprzetworzonego łańcucha: r"d:\stuff\morestuff\furtherdown\THEFILE.txt"aby uniknąć takich rzeczy, jak \sbłędna interpretacja.
smci

Odpowiedzi:

164

Wiele razy byłem gryziony przez ludzi piszących własną ścieżkę, bawiąc się funkcjami i robiąc to źle. Spacje, ukośniki, ukośniki odwrotne, dwukropki - możliwości pomyłki nie są nieskończone, ale i tak łatwo popełnić błędy. Więc jestem zwolennikiem stosowania os.pathi polecam go na tej podstawie.

(Jednak droga do cnoty nie należy do najłatwiejszych i wielu ludzi, gdy ją odkrywają, kusi, aby pójść śliską ścieżką prosto do potępienia. Nie zdadzą sobie sprawy, aż pewnego dnia wszystko się rozpadnie, a oni - lub bardziej prawdopodobne jest, że ktoś inny - musi dowiedzieć się, dlaczego wszystko poszło nie tak i okazuje się, że ktoś utworzył nazwę pliku zawierającą ukośniki i ukośniki odwrotne - a ktoś sugeruje, że odpowiedź brzmi „tego nie robić”. Don ' Nie bądź żadną z tych osób. Z wyjątkiem tego, który pomieszał ukośniki i ukośniki - możesz nimi być, jeśli chcesz).

Możesz uzyskać dysk i ścieżkę + plik w ten sposób:

drive, path_and_file = os.path.splitdrive(path)

Uzyskaj ścieżkę i plik:

path, file = os.path.split(path_and_file)

Uzyskanie poszczególnych nazw folderów nie jest szczególnie wygodne, ale jest to rodzaj uczciwego dyskomfortu, który zwiększa przyjemność późniejszego znalezienia czegoś, co faktycznie działa dobrze:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(Ten Zdejmuje "\"na początku folders, jeśli ścieżka była początkowo absolutna. Można stracić kawałek kodu, jeśli nie chcemy.)

HunnyBear
źródło
@brone - wolę korzystać z tego rozwiązania, niż martwić się o uniknięcie ukośnika. dzięki!
BeeBand
1
Byłbym szczęśliwy, gdyby okazało się, że się mylę, ale wydaje mi się, że sugerowane rozwiązanie nie działa, jeśli zostanie użyta ścieżka taka jak ta "C: \ usr \ rs0 \ my0 \ in111102.log" (chyba że początkowe dane wejściowe są nieprzetworzonym ciągiem znaków )?
shearichard
1
Wygląda na to, że nie spowoduje to prawidłowego podziału ścieżki, jeśli zawiera ona tylko katalog w systemie OSX, taki jak „/ ścieżka / do / mój / folder /”, aby osiągnąć to, że chcesz dodać te dwie linie na początku: if path.endswith("/"):i path = path[:-1].
Kevin London
1
Wolę rozwiązanie @Tompa
jaycode
1
Zgadzam się z jaycode : Tompa „s rozwiązanie jest podejście kanoniczne i powinna być przyjętym rozwiązaniem. Ta zbyt złożona, nieefektywna i podatna na błędy alternatywa nie spełnia wymagań dotyczących kodu produkcyjnego. Nie ma rozsądnego powodu, aby próbować (... i oczywiście nie powiedzie się) iteracyjnie analizować oddzielne nazwy ścieżek, gdy prosty podział ciągów powiedzie się przy użyciu tylko jednej linii kodu.
Cecil Curry,
287

chciałbym zrobić

import os
path = os.path.normpath(path)
path.split(os.sep)

Najpierw znormalizuj ciąg ścieżki do odpowiedniego ciągu dla systemu operacyjnego. Następnie os.sepmusi być bezpieczny do użycia jako separatora w funkcji split.

Tompa
źródło
25
Jedyna prawdziwa odpowiedź: pojawiła się . Rozwiązanie kanoniczne jest oczywiście najprostsze. Ujrzeć! Bo jest elegancki i zgrabny i nie ma nieznośnych krawędzi.
Cecil Curry
20
Jako jedno-liniowiecos.path.normpath(a_path).split(os.path.sep)
Daniel Farrell
2
Wydaje się, że to nie działa dla path = root. W takim przypadku wynikiem path.split jest ['', '']. Ogólnie rzecz biorąc, to rozwiązanie split () daje skrajny lewy katalog z nazwą pustego łańcucha (którą można zastąpić odpowiednim ukośnikiem). Podstawowym problemem jest to, że pojedynczy ukośnik (do przodu lub do tyłu w zależności od systemu operacyjnego) to nazwa katalogu głównego, podczas gdy w innym miejscu ścieżki jest to separator .
gwideman
2
Czy wtedy będzie lepiej działać z lstripem? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
Vidar,
1
@ user60561 To dlatego, że w Linuksie lewy ukośnik jest dozwolonym znakiem w nazwach plików, podczas gdy w systemie Windows nie jest to znak ukośnika. Dlatego w systemie Windows normpathrozpoznaje ukośnik jako separator. W systemie Linux normpathpo prostu przyjmiemy, że masz katalog o nazwie, \1\2a wewnątrz niego plik lub katalog o nazwie 3.
Vojislav Stojkovic
81

Możesz po prostu użyć najbardziej Pythonowego podejścia (IMHO):

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

Co da ci:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Wskazówka polega na tym, aby użyć os.sepzamiast '\\'lub '/', ponieważ to czyni go niezależnym od systemu.

Aby usunąć dwukropek z litery dysku (chociaż nie widzę żadnego powodu, dla którego chciałbyś to zrobić), możesz napisać:

path_list[0] = path_list[0][0]
Maciek D.
źródło
22
To działa some times. Innym razem (przynajmniej w oknach) znajdziesz ścieżki, które wyglądają jak folder\folder2\folder3/file.txt. Lepiej jest najpierw znormalizować (os.path.normpath) ścieżkę, a następnie ją podzielić.
Vikki
7
Ta odpowiedź była już prawie gotowa. Jak sugeruje Vikki , niepowodzenie w znormalizowaniu nazw ścieżek przed podziałem na łańcuchy oznacza zgubę w zwykłych przypadkach skrajnych (np /foo//bar.). Zobacz Tompa jest odpowiedź na bardziej solidne rozwiązanie.
Cecil Curry,
62

W Pythonie> = 3.4 stało się to znacznie prostsze. Możesz teraz użyć, pathlib.Path.partsaby uzyskać wszystkie części ścieżki.

Przykład:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

W przypadku instalacji Pythona 3 w systemie Windows zakłada się, że pracujesz ze ścieżkami systemu Windows, a na * nix zakłada, że ​​pracujesz ze ścieżkami posix. Zwykle tego chcesz, ale jeśli tak nie jest, możesz użyć klas pathlib.PurePosixPathlub pathlib.PureWindowsPathw razie potrzeby:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

Edycja: Dostępna jest również backport do Pythona 2: pathlib2

freidrichen
źródło
3
Path.parts jest tym, o czym zawsze marzyłem, ale do dziś nie wiedziałem, że istnieje.
JamEnergy
dlaczego nie zostało to opakowane wokół ładnej natywnej funkcji Pythona?
Eduardo Pignatelli
2
TO jest odpowiedź!
nayriz
11

Problem tutaj zaczyna się od tego, jak tworzysz ciąg w pierwszej kolejności.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Sporządzono w ten sposób, Python próbuje szczególnym przypadku to: \s, \m, \f, i \T. W twoim przypadku \fjest traktowany jako wysuw formularza (0x0C), podczas gdy inne ukośniki odwrotne są obsługiwane poprawnie. Musisz wykonać jedną z następujących czynności:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

Następnie po podzieleniu jednego z nich uzyskasz pożądany wynik.

Craig Trader
źródło
@W. Craig Trader - dzięki, ale ta ścieżka nie jest tą, którą sam generuję - wraca do mnie z innego programu i muszę te dane przechowywać w zmiennej. Nie jestem pewien, jak przekonwertować dane zapisane w zmiennej na „surowy tekst”.
BeeBand
Nie ma czegoś takiego jak „surowy tekst” ... to po prostu sposób, w jaki reprezentujesz go w źródle. Dołącz r "" do ciągu znaków na początku lub przepuść go przez .replace ('\\', '/')
Marco Mariani
@BeeBand, w jaki sposób odzyskujesz dane z innego programu? Czy czytasz to z pliku, rury, gniazda? Jeśli tak, to nie musisz robić nic wymyślnego; jedynym powodem podwojenia odwrotnych ukośników lub używania nieprzetworzonych łańcuchów jest umieszczenie stałych łańcuchowych w kodzie Pythona. Z drugiej strony, jeśli drugi program generuje podwójne odwrócone ukośniki, to warto to wyczyścić przed podzieleniem ścieżki.
Craig Trader
@W. Craig Trader - czytam to z pliku, który jest zapisywany przez inny program. Z jakiegoś powodu nie mogłem dostać split()lub replace()pracować - ciągle otrzymywałem wartości szesnastkowe. Masz jednak rację, myślę, że szczekałem na niewłaściwe drzewo z pomysłem na surowe struny - myślę, że po prostu użyłem split()niewłaściwie. Ponieważ wypróbowałem niektóre z tych rozwiązań przy użyciu split()i teraz działają dla mnie.
BeeBand
10

Aby uzyskać nieco bardziej zwięzłe rozwiązanie, rozważ następujące kwestie:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]
user1556435
źródło
To moje ulubione rozwiązanie tego problemu. Bardzo dobrze.
Will Moore
1
To nie działa, jeśli ścieżka kończy się na /. Ponadto daje ci pusty ciąg na początku listy, jeśli twoja ścieżka zaczyna się od/
Sorig
4

Właściwie nie mogę wnieść prawdziwej odpowiedzi na to pytanie (ponieważ przyszedłem tutaj, mając nadzieję, że sam go znajdę), ale dla mnie liczba różnych podejść i wszystkie wspomniane zastrzeżenia są najpewniejszym wskaźnikiem, że moduł os.path w Pythonie desperacko tego potrzebuje jako funkcja wbudowana.

antred
źródło
4

Sposób funkcjonalny, z generatorem .

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

W akcji:

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']
Benoit
źródło
3

Mi to pasuje:

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Oczywiście może być konieczne usunięcie okrężnicy z pierwszego składnika, ale zachowanie go umożliwia ponowne złożenie ścieżki.

W rmodyfikujące znaki ciągiem znaków jako „surowe”; zwróć uwagę, że osadzone odwrotne ukośniki nie są podwajane.

rozwijać
źródło
@unwind - rprzed ciągiem znaków, do czego to się odnosi?
BeeBand
2
r oznacza nieprzetworzony ciąg znaków - automatycznie wymyka \ znaki. Jest to przydatne, gdy tworzysz ścieżki.
Wayne Werner,
1
@BeeBand: nie musisz się tym przejmować; r "" jest po prostu czymś, co ma znaczenie podczas kompilacji / parsowania kodu, a nie jest czymś, co staje się własnością łańcucha po przeanalizowaniu. Oznacza po prostu „tutaj jest ciąg znaków, ale nie interpretuj żadnych odwrotnych ukośników jako mających inne znaczenie niż ukośniki odwrotne”.
zrelaksuj się
3
Myślę, że pomocne może być wspomnienie o tobie minus, czy zrobić to bardziej niejednoznacznie używając a.split (os.sep) zamiast twardego kodowania?
Tim McJilton
4
Muszę cię złagodzić, bo straciłeś szansę na wyjaśnienie os.path.spliti os.pathsepbiorąc pod uwagę, że oba są o wiele bardziej przenośne niż to, co napisałeś. To może nie mieć teraz znaczenia dla OP, ale będzie, gdy pisze coś, co musi poruszyć platformy.
Jed Smith
3

To, co dotyczy, mypath.split("\\")byłoby lepiej wyrażone jako mypath.split(os.sep). sepjest separatorem ścieżek dla twojej konkretnej platformy (np. \dla Windows, /dla Uniksa itp.), a kompilacja Pythona wie, której użyć. Jeśli używasz sep, Twój kod będzie niezależny od platformy.

Chris
źródło
1
Lub os.path.split. Chcesz być ostrożny os.pathsep, ponieważ jest :na mojej wersji Pythona w OS X (i os.path.splitpoprawnie obsługuje /).
Jed Smith
4
Masz na myśli os.sep, że nie os.pathsep. Postępuj zgodnie z mądrością zawartą w os.sepdokumentacji: Zauważ, że znajomość tego nie jest wystarczająca do analizowania lub łączenia nazw ścieżek - użyj os.path.split () i os.path.join ().
Jon-Eric
1

re.split () może pomóc trochę bardziej niż string.split ()

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Jeśli chcesz również obsługiwać ścieżki Linuksa i Maca, po prostu dodaj filtr (Brak, wynik), aby usunąć niechciany znak „” z metody split (), ponieważ ich ścieżki zaczynają się od „/” lub „//”. na przykład „// mount / ...” lub „/ var / tmp /”

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
Asi
źródło
1

Możesz rekurencyjnie os.path.splitciąg

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

Testowanie tego na niektórych ciągach ścieżki i ponowne składanie ścieżki za pomocą os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

Pierwszy element listy może wymagać odmiennego traktowania w zależności od tego, jak chcesz radzić sobie z literami dysków, ścieżkami UNC oraz ścieżkami bezwzględnymi i względnymi. Zmiana ostatniego [p]na [os.path.splitdrive(p)]wymusza problem poprzez podzielenie litery dysku i katalogu głównego na krotkę.

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

Edycja: zdałem sobie sprawę, że ta odpowiedź jest bardzo podobna do tej podanej powyżej przez użytkownika1556435 . Zostawiam swoją odpowiedź, ponieważ obsługa komponentu napędu ścieżki jest inna.

Mike Robins
źródło
0

Tak jak inni wyjaśnili - twój problem wynikał z użycia \, który jest znakiem ucieczki w literale / stałej ciągu. OTOH, gdybyś miał ten ciąg ścieżki pliku z innego źródła (odczytany z pliku, konsoli lub zwrócony przez funkcję os) - nie byłoby problemu z podziałem na '\\' lub r '\'.

I tak jak inni sugerowali, jeśli chcesz użyć \w dosłownym programie, musisz albo go zduplikować, \\albo cały literał musi być poprzedzony prefiksem r, tak jak to, r'lite\ral'lub r"lite\ral"aby uniknąć konwersji przez parser tego \i rna znak CR (powrót karetki).

Jest jeszcze jeden sposób - po prostu nie używaj nazw \ścieżek z odwrotnym ukośnikiem w swoim kodzie! Od zeszłego wieku Windows rozpoznaje i działa dobrze z nazwami ścieżek, które używają ukośnika jako separatora katalogu /! Jakoś niewiele osób o tym wie ... ale to działa:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

To przy okazji sprawi, że twój kod będzie działał na Unix, Windows i Mac ... ponieważ wszystkie z nich używają /jako separatora katalogów ... nawet jeśli nie chcesz używać predefiniowanych stałych modułu os.

Nas Banov
źródło
Niestety dane są zwracane z innego programu, który uruchamiam z mojego skryptu w Pythonie. Nie mam żadnej kontroli nad tym, czy użyć „\” czy „/” - to program innej firmy to określa (prawdopodobnie na podstawie platformy).
BeeBand
@BeeBand: Ach, wtedy nie będziesz miał problemu, którego doświadczyłeś podczas testowania, kiedy podałeś ciąg jako literał w swoim programie. Lub możesz wykonać następujący zły hack po otrzymaniu ścieżki: var = var.replace('\\','/')- zamień \ na / i kontynuuj pracę tylko z ukośnikami w przód :)
Nas Banov
to rzeczywiście zły hack: o)
BeeBand
@BeeBand: dlatego ostrzegałem. Kiedy mówię, że coś jest złe, niekoniecznie mam na myśli to, że nigdy nie powinno się tego używać - ale należy być bardzo świadomym, dlaczego tego używają, i uważać na niezamierzone konsekwencje. W tym przypadku bardzo mało prawdopodobną konsekwencją jest to, że jeśli jest używany w systemie plików Unix z `` użyciem w nazwie pliku lub katalogu (jest to naprawdę trudne, ale możliwe) - ten kod ``
zepsuje się
0

Załóżmy, że masz plik filedata.txtz zawartością:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

Możesz czytać i dzielić ścieżki plików:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']
zoli2k
źródło
to rzeczywiście działa, dzięki! Ale wybrałem rozwiązanie brone, ponieważ wolę nie martwić się o ucieczkę przed ukośnikiem.
BeeBand,
9
Nie Pythonic, ponieważ jest zależny od systemu plików.
jb.
0

Używam następującego, ponieważ ponieważ używa funkcji os.path.basename, nie dodaje żadnych ukośników do zwracanej listy. Działa również z ukośnikami dowolnej platformy: tj. \\ lub unixem /. Co więcej, nie dodaje \\\\, którego system Windows używa do ścieżek serwera :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

Tak więc dla „\\\\ serwer \\ folder1 \\ folder2 \\ folder3 \\ folder4”

dostajesz

[„serwer”, „folder1”, „folder2”, „folder3”, „folder4”]

Sójka
źródło
1
Nie następuje to po niezmienniku, do którego przekazanie wyniku os.path.join()powinno zwrócić oryginalny ciąg. Powiedziałbym, że prawidłowe wyjście dla twojego przykładowego wejścia to [r'\\','server','folder1','folder2','folder3','folder4']. To os.path.split()znaczy co robi.
Jon-Eric,
0

Właściwie nie jestem pewien, czy to w pełni odpowiada na pytanie, ale dobrze się bawiłem pisząc tę ​​małą funkcję, która przechowuje stos, trzyma się manipulacji opartych na os.path i zwraca listę / stos elementów.

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16
mallyvai
źródło
0

Poniższy wiersz kodu może obsłużyć:

  1. C: / ścieżka / ścieżka
  2. C: // ścieżka // ścieżka
  3. C: \ ścieżka \ ścieżka
  4. C: \ ścieżka \ ścieżka

path = re.split (r '[/// \]', ścieżka)

Gour Bera
źródło
0

Jedna rekurencyjna dla zabawy.

Nie jest to najbardziej elegancka odpowiedź, ale powinna działać wszędzie:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]
DuGNu
źródło
rzeczywiście, przepraszam. Powinienem był uważnie przeczytać pytanie ... ścieżkę „do”.
DuGNu
-1

posługiwać się ntpath.split()

deft_code
źródło
kiedy używam os.path.split () otrzymuję, ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand
Jak zauważył BeeBand, os.path.split () naprawdę nie robi pożądanej rzeczy.
odpoczynek
przepraszam, właśnie zdałem sobie sprawę, że os.path działa tylko w zależności od twojego systemu operacyjnego. ntpath przeanalizuje ścieżki dos.
deft_code,
nawet z ntpath nadal dostajęd:\\stuff, morestuff\x0curtherdown\thefile.mux
BeeBand
2
@BeeBand: masz problemy z ucieczką ciągu. '\x0c'to znak wysuwu formularza. Sposób tworzenia znaku wysuwu formularza to „\ f”. Jeśli naprawdę potrzebujesz literału „\ f”, masz dwie opcje: '\\f'lub r'\f'.
deft_code