Python'da hem Linux hem de Windows'ta “/” (dizin ayırıcı) nasıl kullanılır?


191

Python / bir klasörde belirli bir dosya yapmak için kullanan bir kod yazdım, eğer çalışmaz Windows kodunu kullanmak istiyorsanız, ben Windows ve Linux kodu kullanabilirsiniz bir yolu var.

Python bu kodu kullanıyorum:

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

Diyelim ki Windows makinemde kodumu kullanacağım zaman kodum çalışmaz.

Hem Linux hem de Windows'ta "/" (dizin ayırıcı) nasıl kullanılır?


1
Başlangıçta Win / * nix'e bağlı olarak tanımlayabilir ve daha sonra değişkenle çalışabilirsiniz.
— fedorqui 'SO zarar vermeyi durdurun'

12
Windows'ta \ veya / dizinini dizin ayırıcı olarak kullanabilirsiniz.
— SecurityMatt

12
Windows /dizin yollarında destekler . Hangi özel probleminiz var? Sorunu gösteren bir kod gönderin.
— Michael Geary

Windows kullanıcı alanı programlarına bağlı olmadıkça, eğik çizgi geriye doğru olduğu kadar çalışır. Bazı cmd komutları bununla ilgili sorunlara sahiptir.
— Pihhan

1
@Mehrdad: Win32 API'nın '/' kabul etmediği bir örnek biliyor musunuz? (cmd.exe ve diğer programları saymıyor)
— Eryk Sun

Yanıtlar:


268

Kullanın os.path.join(). Örnek: os.path.join(pathfile,"output","log.txt").

Kodunuzda: rootTree.write(os.path.join(pathfile,"output","log.txt"))


9
os.path.joingöreceli yol bileşenlerini bir araya getirmek için daha karmaşık bir mantık kullanır. Sadece zincirlemek istediğinizde os.sep.join, doğru seçimdir.
— Bachsau

108

kullanın:

import os
print os.sep

ayırıcının geçerli bir işletim sisteminde nasıl göründüğünü görmek için.
Kodunuzda şunları kullanabilirsiniz:

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


39

os.path.normpath(pathname)/yol ayırıcılarını \Windows'ta ayırıcılara dönüştürdüğü için de belirtilmelidir . Ayrıca gereksiz uplevel başvuruları ... yani çöker, A/Bve A/foo/../Bve A/./Btüm haline A/B. Ve eğer Windows iseniz, bunların hepsi olur A\B.


3
Bu, IMO'nun "Linux ve Windows'da" / "(dizin ayırıcı) nasıl kullanılacağı" olarak ifade edildiği gibi soruya en iyi cevaptır. Ve aynı zamanda fazlasıyla kullanışlı - Ben daha çok yapardım os.path.normpath('a/b/c/d/file.ext')daha os.path.join('a','b','c','d','file.ext')uzun bir yol belirlemek gerektiğinde.
— ukrutt

Ben de bu cevabı çok yardımcı buldum. Tutarlı bir ayırıcı ile yollar oluşturmak için bir yöntem arıyordum. Ünlü os.path.joinsadece sağlanan her şeye katılır. örneğin join("a/b", "c\d")verir a/b\c\d(pencerelerde). Ama joinve ( normpathörneğin a\b\c\dpencerelerde) doğru kombinasyonu ile beklenen sonucu elde edebilirsiniz
— Sumudu

17

Python 3.4+ çalıştıracak kadar şanslıysanız, şunları kullanabilirsiniz pathlib:

from pathlib import Path

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

Veya eşdeğer olarak,

path = Path(dir) / subdir / filename

16

Size yardımcı olacak bazı yararlı bağlantılar:


2
pathsep? Genellikle yararlı, ama burada değil, IMO.
— glglgl

2
@glglgl Gerçekten. Ben aradım sepama kendim de bu post Dayanamadım :) (Ben OP gelecekte yapılacak çalışmalar için faydalı bulduğu olacak varsayılır)
— Maroun


8

" Os.sep " kullanabilirsiniz

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

4

Dizin ve dosya adlarını kendiniz oluşturmayın, python'un içerdiği kütüphaneleri kullanın.

Bu durumda ilgili olan os.path'dir . Özellikle bir dizinden yeni bir yol adı ve dosya adını veya dizini ve dosya adını tam yoldan alan bölmeyi oluşturan birleştirme.

Örneğin,

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.