Как использовать «/» (разделитель каталогов) в Linux и Windows в Python?


191

Я написал код на Python, который использует /, чтобы сделать определенный файл в папке, если я хочу использовать код в Windows, он не будет работать, есть ли способ, с помощью которого я могу использовать код в Windows и Linux.

В Python я использую этот код:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Когда я буду использовать свой код в предположении, что машина Windows, мой код не будет работать.

Как использовать «/» (разделитель каталогов) в Linux и Windows?


1
Вы можете определить его в начале в зависимости от Win / * nix, а затем работать с переменной.
Федорки "ТАК прекрати вредить"

12
В Windows вы можете использовать \ или / в качестве разделителя каталогов.
SecurityMatt

12
Windows поддерживает /в каталогах пути. Какие конкретные проблемы у вас возникли? Опубликовать код, который иллюстрирует проблему.
Майкл Гири

Если вы не зависите от программ, работающих в Windows, косая черта работает так же, как и назад. Однако некоторые команды cmd имеют проблемы с этим.
Пихан

1
@Mehrdad: Знаете ли вы пример, для которого Win32 API не принимает '/'? (не считая cmd.exe и других программ)
Eryk Sun

Ответы:


268

Использование os.path.join(). Пример: os.path.join(pathfile,"output","log.txt").

В вашем коде это будет: rootTree.write(os.path.join(pathfile,"output","log.txt"))


9
os.path.joinиспользует более сложную логику для сопоставления нескольких относительных компонентов пути. Когда вы просто хотите связать их, os.sep.joinэто правильный выбор.
Бахсау

108

Использование:

import os
print os.sep

чтобы увидеть, как разделитель выглядит на текущей ОС.
В вашем коде вы можете использовать:

import os
path = os.path.join('folder_name', 'file_name')


39

os.path.normpath(pathname)также следует упомянуть, поскольку он преобразует /разделители пути в \разделители в Windows. Он также разрушается избыточные uplevel ссылки ... то есть, A/Bи A/foo/../Bи A/./Bвсе стали A/B. И если вы Windows, все это становится A\B.


3
Это IMO лучший ответ на вопрос, как он был сформулирован, «как использовать« / »(разделитель каталогов) как в Linux, так и в Windows». И это также чрезвычайно полезно - я бы предпочел сделать гораздо больше, os.path.normpath('a/b/c/d/file.ext')чем os.path.join('a','b','c','d','file.ext')когда мне нужно указать длинный путь.
Укрутт

Я также нашел этот ответ очень полезным. Я искал метод для генерации путей с последовательным разделителем. Знаменитая os.path.joinпросто присоединяется ко всему при условии. например, join("a/b", "c\d")дает a/b\c\d(на окнах). Но я могу получить ожидаемый результат с правильной комбинацией joinи normpath, например, a\b\c\d(на окнах)
Sumudu

17

Если вам посчастливилось запустить Python 3.4+, вы можете использовать pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

или, что эквивалентно,

path = Path(dir) / subdir / filename

16

Несколько полезных ссылок, которые помогут вам:


2
pathsep? Вообще полезно, но не здесь, ИМО.
glglgl

2
@glglgl Действительно. Я искал, sepно не мог удержаться, чтобы опубликовать это тоже (я предполагал, что ОП найдет его полезным для будущей работы) :)
Maroun


8

Вы можете использовать " os.sep "

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)

4

Не создавайте имена каталогов и файлов самостоятельно, используйте библиотеки Python.

В этом случае соответствующим является os.path . Особенно объединение, которое создает новое имя пути из каталога и имя файла или каталога и разделяет, который получает имя файла из полного пути.

Ваш пример будет

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.