2015-09-07 3 views
3

os.path.sep - это символ, используемый операционной системой для разделения компонентов пути.Как использовать/os.path.sep?

Но когда os.path.sep используется в os.path.join(), почему он усекает путь?

Пример:

Вместо 'home/python', os.path.join возвращается '/python':

>>> import os 
>>> os.path.join('home', os.path.sep, 'python') 
'/python' 

Я знаю, что os.path.join() вставляет разделитель каталогов в неявном виде.

Где os.path.sep Полезно? Почему он обрезает путь?

ответ

3

Где os.path.sep полезен?

Я подозреваю, что он существует главным образом из-за того, что в модуле все равно требуется переменная (чтобы избежать жесткого кодирования), и если она есть, она также может быть документирована. В его документации говорится, что это "occasionally useful".

Почему это усекает путь?

От docs for os.path.join():

Если компонент абсолютный путь, все предыдущие компоненты выбрасываются и соединение продолжается от абсолютного компонента пути.

и / - это абсолютный путь на системах * nix.

0

Капля os.path.sep от os.path.join() звонок. os.path.join() использует os.path.sep внутренне.

В вашей системе os.path.sep == '/', который интерпретируется как корневой каталог (абсолютный путь), и поэтому os.path.join('home', '/', 'python') эквивалентен os.path.join('/', 'python') == '/python'. From the docs:

Если компонент абсолютный путь, все предыдущие компоненты выбрасываются прочь и соединение продолжается от абсолютного компонента пути.

0

Как правильно приведены в строку документации по os.path.join -

Объединение двух или более компонентов, путь к файлу, вставляя '/' при необходимости. Если какой-либо компонент является абсолютным путем, все предыдущие компоненты пути будут отброшены.

же дается в docs, а также -

os.path.join (путь, * трактов)

Регистрация одну или более компонентов пути разумно. Возвращаемое значение представляет собой конкатенацию пути и любых членов * путей с ровно одним разделителем каталога (os.sep) после каждой непустой части, кроме последней, что означает, что результат будет заканчиваться только в разделителе, если последняя часть пуста , Если компонент является абсолютным путем, все предыдущие компоненты выбрасываются, и соединение продолжается от компонента абсолютного пути.

Когда вы даете os.path.sep один, он рассматривается как абсолютный путь к корневому каталогу - /.

Обратите внимание: это для os.path, основанного на unix/linux, который составляет posixpath. Хотя такое же поведение наблюдается и в окнах os.path.join().

Пример -

>>> import os.path 
>>> os.path.join.__doc__ 
"Join two or more pathname components, inserting '/' as needed.\n If any component is an absolute path, all previous path components\n will be discarded." 
0

Вот фрагмент кода, который выполняется, если вы находитесь на POSIX машины:

posixpath.py

# Join pathnames. 
# Ignore the previous parts if a part is absolute. 
# Insert a '/' unless the first part is empty or already ends in '/'. 

def join(a, *p): 
    """Join two or more pathname components, inserting '/' as needed. 
    If any component is an absolute path, all previous path components 
    will be discarded. An empty last part will result in a path that 
    ends with a separator.""" 
    sep = _get_sep(a) 
    path = a 
    try: 
     if not p: 
      path[:0] + sep #23780: Ensure compatible data type even if p is null. 
     for b in p: 
      if b.startswith(sep): 
       path = b 
      elif not path or path.endswith(sep): 
       path += b 
      else: 
       path += sep + b 
    except (TypeError, AttributeError, BytesWarning): 
     genericpath._check_arg_types('join', a, *p) 
     raise 
    return path 

В частности, линии:

 if b.startswith(sep): 
      path = b 

И, поскольку os.path.sep определенно начинается с этого символа, всякий раз, когда мы сталкиваемся с этим, мы выбрасываем часть переменной path, которая уже построена и начинается с следующего элемента в p.

0

Но когда os.path.sep используется в os.path.join(), почему он обрезает путь?

Цитирование непосредственно из документации os.path.join

Если компонент абсолютный путь, все предыдущие компоненты выбрасываются и соединение продолжается от абсолютного компонента пути.

Так что, когда вы делаете:

os.path.join('home', os.path.sep, 'python') 

os.path.sep возвращает '/' который является абсолютным путем, и так 'home' отбрасываются, и вы получите только '/python' как выход.

Это может также ясно из приведенного примера:

>>> import os 
>>> os.path.join('home','/python','kivy') 
'/python/kivy' 

Где os.path.sep это полезно?

os.path.sep или os.sep возвращает символ, используемый в операционной системе, чтобы отделить компоненты пути. Но опять-таки цитирую из docs:

Обратите внимание, что знание этого не достаточно, чтобы быть в состоянии разобрать или конкатенации - использовать файловые пути os.path.split() и os.path.join() - но это иногда полезно.