Як використовувати “/” (роздільник каталогів) в 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, а потім працювати зі змінною.
fedorqui 'ТАК перестаньте шкодити'

12
У Windows можна використовувати або \ або / як роздільник каталогів.
SecurityMatt

12
Windows підтримує /в каталогах шляхи. Яка конкретна проблема у вас є? Опублікуйте код, який ілюструє проблему.
Майкл Гірі

Якщо ви не залежать від програм для користувачів простору Windows, функція перекидання вперед може працювати так само, як і назад. Однак деякі команди cmd мають проблеми з цим.
Піхань

1
@Mehrdad: Ви знаєте приклад, для якого API Win32 не приймає '/'? (без урахування cmd.exe та інших програм)
Eryk Вс

Відповіді:


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')тоді, коли мені потрібно вказати довгий шлях.
ukrutt

Я також вважав цю відповідь дуже корисною. Я шукав метод генерації шляхів із послідовним роздільником. Знаменитий os.path.joinпросто приєднується до всього, що надається. наприклад join("a/b", "c\d")дає a/b\c\d(на вікна). Але я можу отримати очікуваний результат при правильному поєднанні joinі normpath, наприклад a\b\c\d(на windows)
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
шлях Взагалі корисно, але не тут, ІМО.
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.