Làm cách nào để sử dụng tập tin / bộ phân tách thư mục trong cả Linux và Windows trong Python?


191

Tôi đã viết một mã bằng python sử dụng / để tạo một tệp cụ thể trong một thư mục, nếu tôi muốn sử dụng mã trong windows thì nó không hoạt động, có cách nào để tôi có thể sử dụng mã trong Windows và Linux.

Trong python tôi đang sử dụng mã này:

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

Khi tôi sẽ sử dụng mã của mình trong giả sử máy windows, mã của tôi sẽ không hoạt động.

Làm cách nào để sử dụng "/" (dấu tách thư mục) trong cả Linux và Windows?


1
Bạn có thể xác định nó ngay từ đầu tùy thuộc vào Win / * nix và sau đó làm việc với biến.
fedorqui 'SO ngừng làm hại'

12
Trong Windows, bạn có thể sử dụng \ hoặc / làm dấu phân cách thư mục.
SecurityMatt

12
Windows hỗ trợ /trong đường dẫn thư mục. Bạn đang gặp vấn đề cụ thể nào? Đăng một số mã minh họa vấn đề.
Michael Geary

Trừ khi bạn phụ thuộc vào các chương trình không gian người dùng Windows, dấu gạch chéo chuyển tiếp hoạt động cũng như lùi lại. Một số lệnh cmd có vấn đề với điều đó tuy nhiên.
Pihhan

1
@Mehrdad: Bạn có biết một ví dụ mà API Win32 không chấp nhận '/' không? (không tính cmd.exe và các chương trình khác)
Eryk Sun

Câu trả lời:


266

Sử dụng os.path.join(). Ví dụ : os.path.join(pathfile,"output","log.txt").

Trong mã của bạn đó sẽ là: rootTree.write(os.path.join(pathfile,"output","log.txt"))


8
os.path.joinsử dụng logic phức tạp hơn để khớp một số thành phần đường dẫn tương đối với nhau. Khi bạn chỉ muốn xâu chuỗi chúng, os.sep.joinlà lựa chọn đúng đắn.
Bachsau

108

Sử dụng:

import os
print os.sep

để xem cách phân tách trông như thế nào trên một hệ điều hành hiện tại.
Trong mã của bạn, bạn có thể sử dụng:

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


38

os.path.normpath(pathname)cũng nên được đề cập vì nó chuyển đổi các /dấu phân cách thành các \dấu phân cách trên Windows. Nó cũng sụp đổ tài liệu tham khảo uplevel dư thừa ... tức là, A/BA/foo/../BA/./Btất cả trở thành A/B. Và nếu bạn là Windows, tất cả sẽ trở thành A\B.


3
Đây là IMO câu trả lời tốt nhất cho câu hỏi vì nó đã được đặt ra, "làm thế nào để sử dụng / / (bộ tách thư mục) trong cả Linux và Windows". Và nó cũng rất hữu ích - tôi muốn làm os.path.normpath('a/b/c/d/file.ext')nhiều hơn là os.path.join('a','b','c','d','file.ext')khi tôi cần chỉ định một con đường dài.
ukrutt 17/8/2016

Tôi cũng tìm thấy câu trả lời này rất hữu ích. Tôi đang tìm kiếm một phương pháp để tạo các đường dẫn với một dấu phân cách nhất quán. Sự nổi tiếng os.path.joinchỉ cần tham gia bất cứ điều gì được cung cấp. ví dụ join("a/b", "c\d")cho a/b\c\d(trên windows). Nhưng tôi có thể nhận được kết quả mong đợi với sự kết hợp đúng đắn joinnormpath, ví dụ a\b\c\d(trên cửa sổ)
Sumudu

17

Nếu bạn đủ may mắn để chạy Python 3.4+, bạn có thể sử dụng pathlib:

from pathlib import Path

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

hoặc, tương đương,

path = Path(dir) / subdir / filename

16

Một số liên kết hữu ích sẽ giúp bạn:


2
bệnh lý? Nói chung là hữu ích, nhưng không phải ở đây, IMO.
glglgl

2
@glglgl Thật vậy. Tôi đã tìm kiếm sepnhưng không thể cưỡng lại bản thân mình để đăng bài này (Tôi cho rằng OP sẽ thấy nó hữu ích cho công việc trong tương lai) :)
Maroun


8

Bạn có thể sử dụng " os.sep "

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

4

Đừng xây dựng thư mục và tên tệp của bạn, hãy sử dụng các thư viện đi kèm của python.

Trong trường hợp này, cái có liên quan là os.path . Đặc biệt là tham gia để tạo một tên đường dẫn mới từ một thư mục và một tên tệp hoặc thư mục và phân tách để có được tên tệp từ một đường dẫn đầy đủ.

Ví dụ của bạn sẽ là

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.