Cách tìm nếu thư mục tồn tại trong Python


1139

Trong osmô-đun trong Python, có một cách để tìm nếu một thư mục tồn tại, đại loại như:

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
Một lời cảnh báo - câu trả lời được đánh giá cao nhất có thể dễ bị ảnh hưởng bởi các điều kiện chủng tộc. Bạn có thể muốn thực hiện os.statthay vào đó, để xem liệu cả thư mục có tồn tại và là một thư mục cùng một lúc không.
d33tah

1
@ d33tah Bạn có thể có một điểm tốt nhưng tôi không thấy cách sử dụng os.statđể nói thư mục từ một tệp. Nó tăng lên OSErrorkhi đường dẫn không hợp lệ, bất kể đó là tệp hay thư mục. Ngoài ra, bất kỳ mã nào sau khi kiểm tra cũng dễ bị ảnh hưởng bởi các điều kiện chủng tộc.
Tomáš Zato - Phục hồi Monica

4
@ TomášZato: dẫn đến một kết luận rằng nó an toàn khi chỉ thực hiện thao tác và xử lý lỗi.
d33tah

2
@ David542 Tôi đã thêm một trường hợp làm rõ với các bài kiểm tra về độ chính xác cho "isdir" "tồn tại". Tôi nghĩ bạn sẽ học được bất cứ điều gì bây giờ. Nhưng nó có thể chiếu sáng những người mới.
GeoStoneMarten 2/12/2015

Câu trả lời:


1729

Bạn đang tìm kiếm os.path.isdir, hoặc os.path.existsnếu bạn không quan tâm đó là tập tin hay thư mục.

Thí dụ:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib Mặc dù dấu ngoặc đơn có thể được sử dụng để chỉ ra rằng một đối tượng có thể gọi được, nhưng điều đó không hữu ích trong Python, vì ngay cả các lớp cũng có thể gọi được. Ngoài ra, các hàm là các giá trị hạng nhất trong Python và bạn có thể sử dụng chúng mà không cần ký hiệu dấu ngoặc đơn, như trongexisting = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
Bạn có thể truyền các hàm cho các hàm khác, như maptrong trường hợp chung, bạn gọi các hàm bằng các đối số và dấu ngoặc đơn. Ngoài ra, có một số lỗi đánh máy trong ví dụ của bạn. có lẽ bạn có nghĩa là filter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib']).
hughdbrown

4
Ngoài ra, có os.path.isfile(path)nếu bạn chỉ quan tâm đến việc nó là một tập tin.
Nicholas

2
Xin lưu ý rằng trên một số nền tảng, các nền tảng này sẽ trả về false nếu tệp / thư mục tồn tại, nhưng cũng xảy ra lỗi cho phép đọc.
chăn bò

74

Thật gần! os.path.isdirtrả về Truenếu bạn chuyển vào tên của một thư mục hiện đang tồn tại. Nếu nó không tồn tại hoặc nó không phải là một thư mục, thì nó sẽ trả về False.


70

Python 3.4 giới thiệu các pathlibmô-đun vào thư viện chuẩn, cung cấp một cách tiếp cận hướng đối tượng để xử lý đường dẫn hệ thống tập tin. Các phương thức is_dir()exists()của một Pathđối tượng có thể được sử dụng để trả lời câu hỏi:

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

Các đường dẫn (và chuỗi) có thể được nối cùng với /toán tử:

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlib cũng có sẵn trên Python 2.7 thông qua mô đun pathlib2 trên PyPi.


Một số giải thích sẽ hữu ích. Tại sao các bạn làm " p / 'bin' / 'vim'?
Nathan

1
@frank Tôi đã xây dựng một chút về phần thứ hai của câu trả lời.
joelostblom

34

Có, sử dụng os.path.exists().


23
Điều đó không kiểm tra xem đường dẫn là một thư mục.
Kirk Strauser

7
Cuộc gọi tốt Những người khác đã chỉ ra rằng os.path.isdirsẽ hoàn thành điều đó.
aganders3

3
Nếu bạn hiểu rằng điều này không trả lời câu hỏi, tại sao bạn không xóa câu trả lời?

3
@CamilStaps Câu hỏi này đã được xem 354000 lần (tính đến thời điểm hiện tại). Câu trả lời ở đây không chỉ dành cho OP, chúng dành cho bất kỳ ai có thể đến đây vì bất kỳ lý do gì. Câu trả lời của aganders3 là thích hợp ngay cả khi nó không trực tiếp giải quyết vấn đề của OP.
Gabriel

4
@Gabriel thì nên làm rõ trong câu trả lời điều này thực sự làm gì.

21

Chúng ta có thể kiểm tra với 2 chức năng tích hợp

os.path.isdir("directory")

Nó sẽ cung cấp cho boolean đúng thư mục được chỉ định có sẵn.

os.path.exists("directoryorfile")

Nó sẽ cho boolead đúng nếu thư mục hoặc tệp được chỉ định có sẵn.

Để kiểm tra xem đường dẫn có phải là thư mục hay không;

os.path.isdir("directorypath")

sẽ cho boolean đúng nếu đường dẫn là thư mục


2
Điều này là hoàn toàn dư thừa với câu trả lời cũ, hàng đầu.
Davis Herring


10

Như trong:

In [3]: os.path.exists('/d/temp')
Out[3]: True

Có lẽ ném vào một os.path.isdir(...)để chắc chắn.


10

Chỉ cần cung cấp os.statphiên bản (python 2):

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

os cung cấp cho bạn rất nhiều khả năng sau:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

listdir sẽ đưa ra một ngoại lệ nếu đường dẫn đầu vào không hợp lệ.


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
python có các hàm dựng sẵn để tạo thư mục, vì vậy sử dụng tốt hơn os.makedirs('mydir')thay vìos.system(...)
gizzmole

9
Bạn đang in ra 'thư mục mới đã được tạo' nhưng bạn không biết điều đó. Nếu bạn không có quyền tạo thư mục thì sao? Bạn sẽ in 'thư mục mới đã được tạo' nhưng điều đó không đúng. Nó sẽ
Wojciech Jakubas

4

Có một Unipathmô-đun thuận tiện .

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

Những thứ liên quan khác bạn có thể cần:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

Bạn có thể cài đặt nó bằng pip:

$ pip3 install unipath

Nó tương tự như tích hợp pathlib. Sự khác biệt là nó xử lý mọi đường dẫn dưới dạng một chuỗi ( Pathlà một lớp con của chuỗi str), vì vậy nếu một số hàm mong đợi một chuỗi, bạn có thể dễ dàng truyền cho nó một Pathđối tượng mà không cần phải chuyển đổi nó thành chuỗi.

Ví dụ, điều này hoạt động rất tốt với Django và settings.py:

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

Bạn cũng có thể muốn tạo thư mục nếu nó không có ở đó.

Nguồn , nếu nó vẫn còn trên SO.

================================================== ===================

Trên Python ≥ 3.5, sử dụng pathlib.Path.mkdir:

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

Đối với các phiên bản cũ hơn của Python, tôi thấy hai câu trả lời có phẩm chất tốt, mỗi câu trả lời có một lỗ hổng nhỏ, vì vậy tôi sẽ đưa ra ý kiến ​​của mình về nó:

Hãy thử os.path.exists, và xem xét os.makedirscho sự sáng tạo.

import os
if not os.path.exists(directory):
    os.makedirs(directory)

Như đã lưu ý trong các bình luận và các nơi khác, có một điều kiện cuộc đua - nếu thư mục được tạo giữa os.path.existscác os.makedirscuộc gọi và cuộc gọi, os.makedirssẽ thất bại với một OSError. Thật không may, việc bắt OSErrorvà tiếp tục chăn không thể đánh lừa được, vì nó sẽ bỏ qua việc không tạo được thư mục do các yếu tố khác, chẳng hạn như không đủ quyền, đĩa đầy đủ, v.v.

Một tùy chọn sẽ là bẫy OSErrorvà kiểm tra mã lỗi được nhúng (xem Có cách nào để lấy thông tin từ nền tảng OSError của Python không ):

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

Ngoài ra, có thể có một giây os.path.exists, nhưng giả sử một thư mục khác đã tạo thư mục sau lần kiểm tra đầu tiên, sau đó xóa nó trước lần thứ hai - chúng ta vẫn có thể bị lừa.

Tùy thuộc vào ứng dụng, mức độ nguy hiểm của các hoạt động đồng thời có thể nhiều hơn hoặc ít hơn mức độ nguy hiểm gây ra bởi các yếu tố khác như quyền truy cập tệp. Nhà phát triển sẽ phải biết nhiều hơn về ứng dụng cụ thể đang được phát triển và môi trường dự kiến ​​của nó trước khi chọn triển khai.

Các phiên bản hiện đại của Python cải thiện mã này khá nhiều, cả bằng cách phơi bày FileExistsError(trong 3.3 +) ...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

... và bằng cách cho phép một đối số từ khóa os.makedirsđược gọiexist_ok (trong 3.2+).

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

Hai điều

  1. kiểm tra xem thư mục có tồn tại không?
  2. nếu không, tạo một thư mục (tùy chọn).
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
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.