ОБНОВЛЕНИЕ: После всего этого с altsep
текущий выбранный ответ даже не разделяется на обратную косую черту.
>>> import re, os.path
>>> seps = os.path.sep
>>> if os.path.altsep:
... seps += os.path.altsep
...
>>> seps
'\\/'
>>> somepath = r"C:\foo/bar.txt"
>>> print re.split('[%s]' % (seps,), somepath)
['C:\\foo', 'bar.txt'] # Whoops!! it was splitting using [\/] same as [/]
>>> print re.split('[%r]' % (seps,), somepath)
['C:', 'foo', 'bar.txt'] # after fixing it
>>> print re.split('[%r]' % seps, somepath)
['C:', 'foo', 'bar.txt'] # removed redundant cruft
>>>
Теперь вернемся к тому, что мы должны бытьделать:
(конец обновления)
1. Тщательно продумайте, что вы просите - вы можете получить то, что хотите, а нечто вам нужно.
Если у вас есть относительные пути
r"./foo/bar.txt"
(unix) и r"C:foo\bar.txt"
(windows)
вы хотите
[".", "foo", "bar.txt"]
(Unix) и ["C:foo", "bar.txt"]
(Windows)
(обратите внимание на C: foo там) или вы хотите
["", "CWD", "foo", "bar.txt"]
(Unix) и ["C:", "CWD", "foo", "bar.txt"]
(Windows)
где CWD - текущий рабочий каталог (общесистемный в Unix, то есть в C: в Windows)?
2. Вам не нужно искать с помощью os.path.altsep
-os.path.normpath () сделает разделители равномерными и приведёт в порядок другие странности, такие как foo/bar/zot/../../whoopsy/daisy/somewhere/else
Решение, шаг 1: отмените ваш путь с помощью os.path.normpath () или os.path.abspath ().
Шаг 2: выполнение без привязки_path.split (os.path.sep) не очень хорошая идея.Вы должны разбить его на части с помощью os.path.splitdrive (), а затем использовать несколько приложений os.path.split ().
Вот несколько примеров того, что произойдет на шаге 1 в Windows:
>>> os.path.abspath(r"C:/hello\world.txt")
'C:\\hello\\world.txt'
>>> os.path.abspath(r"C:hello\world.txt")
'C:\\Documents and Settings\\sjm_2\\hello\\world.txt'
>>> os.path.abspath(r"/hello\world.txt")
'C:\\hello\\world.txt'
>>> os.path.abspath(r"hello\world.txt")
'C:\\Documents and Settings\\sjm_2\\hello\\world.txt'
>>> os.path.abspath(r"e:hello\world.txt")
'E:\\emoh_ruo\\hello\\world.txt'
>>>
(текущий диск C
, CWD на диске C \Documents and Settings\sjm_2
и CWD на диске E \emoh_ruo
)
Я хотел бы предложить вамнапишите шаг 2 без конгломератов and
и or
, которые есть в вашем примере.Напишите код, как если бы ваша замена знала, где вы живете, и владеет бензопилой: -)