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.