Bagaimana cara menggunakan "/" (pemisah direktori) di Linux dan Windows dengan Python?


191

Saya telah menulis kode dengan python yang menggunakan / untuk membuat file tertentu di folder, jika saya ingin menggunakan kode di windows tidak akan berfungsi, apakah ada cara di mana saya dapat menggunakan kode di Windows dan Linux.

Dalam python saya menggunakan kode ini:

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

Ketika saya akan menggunakan kode saya di mesin windows misalkan kode saya tidak akan berfungsi.

Bagaimana cara menggunakan "/" (pemisah direktori) di Linux dan Windows?


1
Anda dapat mendefinisikannya di awal tergantung pada Win / * nix dan kemudian bekerja dengan variabel.
fedorqui 'SO berhenti merugikan'

12
Di Windows Anda dapat menggunakan \ atau / sebagai pemisah direktori.
SecurityMatt

12
Dukungan Windows /di jalur direktori. Apa masalah spesifik yang Anda alami? Posting beberapa kode yang menggambarkan masalah.
Michael Geary

Kecuali Anda bergantung pada program userspace Windows, forward slash berfungsi dan mundur. Namun beberapa perintah cmd bermasalah dengan itu.
Pihhan

1
@Mehrdad: Apakah Anda tahu contoh di mana Win32 API tidak menerima '/'? (tidak termasuk cmd.exe dan program lainnya)
Eryk Sun

Jawaban:


268

Gunakan os.path.join(). Contoh: os.path.join(pathfile,"output","log.txt").

Dalam kode Anda itu adalah: rootTree.write(os.path.join(pathfile,"output","log.txt"))


9
os.path.joinmenggunakan logika yang lebih kompleks untuk mencocokkan beberapa komponen jalur relatif bersama. Ketika Anda hanya ingin rantai mereka, os.sep.joinadalah pilihan yang tepat.
Bachsau

108

Menggunakan:

import os
print os.sep

untuk melihat bagaimana pemisah terlihat pada OS saat ini.
Dalam kode Anda, Anda dapat menggunakan:

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


39

os.path.normpath(pathname)juga harus disebutkan karena mengubah /pemisah jalur menjadi \pemisah pada Windows. Ini juga runtuh referensi tingkat tinggi yang berlebihan ... yaitu, A/Bdan A/foo/../Bdan A/./Bsemua menjadi A/B. Dan jika Anda Windows, ini semua menjadi A\B.


3
Ini adalah IMO jawaban terbaik untuk pertanyaan seperti yang diungkapkan, "bagaimana menggunakan" / "(pemisah direktori) di Linux dan Windows". Dan itu juga sangat berguna - saya lebih suka melakukannya os.path.normpath('a/b/c/d/file.ext')daripada os.path.join('a','b','c','d','file.ext')ketika saya harus menentukan jalan yang panjang.
ukrutt

Saya juga menemukan jawaban ini sangat membantu. Saya mencari metode untuk menghasilkan jalur dengan pemisah yang konsisten. Yang terkenal os.path.joinhanya bergabung dengan apa saja yang disediakan. misalnya join("a/b", "c\d")memberi a/b\c\d(di windows). Tetapi saya bisa mendapatkan hasil yang diharapkan dengan kombinasi yang tepat dari joindan normpath, misalnya a\b\c\d(pada windows)
Sumudu

17

Jika Anda cukup beruntung menjalankan Python 3.4+, Anda dapat menggunakan pathlib:

from pathlib import Path

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

atau, secara setara,

path = Path(dir) / subdir / filename

16

Beberapa tautan bermanfaat yang akan membantu Anda:


2
pathsep? Umumnya bermanfaat, tetapi tidak di sini, IMO.
glglgl

2
@glglgl Memang. Saya mencari septetapi tidak bisa menahan diri untuk memposting ini juga (saya berasumsi OP akan menemukannya berguna untuk pekerjaan di masa depan) :)
Maroun


8

Anda dapat menggunakan " os.sep "

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

4

Jangan membangun direktori dan nama file diri Anda, gunakan pustaka python termasuk.

Dalam hal ini yang relevan adalah os.path . Terutama bergabung yang membuat nama path baru dari direktori dan nama file atau direktori dan split yang mendapatkan nama file dari path lengkap.

Teladan Anda akan menjadi

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.