Hướng dẫn check if file exists python - kiểm tra xem tệp có tồn tại python không

Làm cách nào để kiểm tra xem một tệp có tồn tại hay không, sử dụng Python, mà không cần sử dụng câu lệnh thử?

Hiện có sẵn kể từ Python 3.4, nhập và khởi tạo đối tượng

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
9 với tên tệp và kiểm tra phương thức
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
0 (lưu ý rằng điều này trả về đúng với các liên kết symlink chỉ vào các tệp thông thường):

>>> from pathlib import Path
>>> Path('/').is_file()
False
>>> Path('/initrd.img').is_file()
True
>>> Path('/doesnotexist').is_file()
False

Nếu bạn đang sử dụng Python 2, bạn có thể quay lại mô -đun Pathlib từ Pypi,

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
1 hoặc kiểm tra
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
2 từ mô -đun
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
3:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False

Bây giờ những điều trên có lẽ là câu trả lời trực tiếp thực dụng tốt nhất ở đây, nhưng có khả năng một điều kiện chủng tộc (tùy thuộc vào những gì bạn đang cố gắng thực hiện) và thực tế là việc triển khai cơ bản sử dụng

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4, nhưng Python sử dụng
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 ở mọi nơi trong thực hiện.

Bởi vì Python sử dụng

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 ở khắp mọi nơi, thực sự không có lý do gì để tránh việc thực hiện sử dụng nó.

Nhưng phần còn lại của câu trả lời này cố gắng xem xét những cảnh báo này.

Dài hơn, câu trả lời giả tạo hơn nhiều

Có sẵn kể từ Python 3.4, sử dụng đối tượng

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
9 mới trong
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
8. Lưu ý rằng
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
9 không hoàn toàn đúng, bởi vì các thư mục không phải là tệp (ngoại trừ theo nghĩa Unix rằng mọi thứ đều là một tệp).

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True

Vì vậy, chúng tôi cần sử dụng

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
0:

>>> root.is_file()
False

Đây là sự giúp đỡ trên

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
0:

is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).

Vì vậy, chúng ta hãy lấy một tệp mà chúng ta biết là một tệp:

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True

Theo mặc định,

>>> root.is_file()
False
2 xóa tệp khi đóng (và sẽ tự động đóng khi không có thêm tài liệu tham khảo nào tồn tại).

>>> del file
>>> filepathobj.exists()
False
>>> filepathobj.is_file()
False

Tuy nhiên, nếu bạn đào sâu vào việc thực hiện, bạn sẽ thấy rằng

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
0 sử dụng
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4:

def is_file(self):
    """
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
    """
    try:
        return S_ISREG(self.stat().st_mode)
    except OSError as e:
        if e.errno not in (ENOENT, ENOTDIR):
            raise
        # Path doesn't exist or is a broken symlink
        # (see https://bitbucket.org/pitrou/pathlib/issue/12/)
        return False

Điều kiện cuộc đua: Tại sao chúng tôi thích thử

Chúng tôi thích

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 vì nó tránh được điều kiện chủng tộc. Với
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4, bạn chỉ cần cố gắng đọc tệp của mình, hy vọng nó sẽ ở đó, và nếu không, bạn sẽ nắm bắt được ngoại lệ và thực hiện bất kỳ hành vi dự phòng nào có ý nghĩa.

Nếu bạn muốn kiểm tra xem một tệp có tồn tại không trước khi bạn cố đọc nó và bạn có thể xóa nó và sau đó bạn có thể sử dụng nhiều luồng hoặc quy trình, hoặc một chương trình khác biết về tệp đó và có thể xóa nó - bạn có nguy cơ Một điều kiện cuộc đua nếu bạn kiểm tra nó tồn tại, bởi vì sau đó bạn đang chạy đua để mở nó trước khi điều kiện (sự tồn tại của nó) thay đổi.race condition if you check it exists, because you are then racing to open it before its condition (its existence) changes.

Điều kiện chủng tộc rất khó để gỡ lỗi vì có một cửa sổ rất nhỏ trong đó chúng có thể khiến chương trình của bạn thất bại.

Nhưng nếu đây là động lực của bạn, bạn có thể nhận được giá trị của câu lệnh

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 bằng cách sử dụng trình quản lý bối cảnh
>>> root.is_file()
False
8.

Tránh các điều kiện chủng tộc mà không có tuyên bố thử: >>> root.is_file() False 8

Python 3.4 cung cấp cho chúng tôi Trình quản lý bối cảnh

>>> root.is_file()
False
8 (trước đây là Trình quản lý bối cảnh
is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
1), điều này chính xác về mặt ngữ nghĩa trong ít dòng hơn, trong khi (ít nhất là hời hợt) đáp ứng yêu cầu ban đầu để tránh tuyên bố
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4:

from contextlib import suppress
from pathlib import Path

Usage:

>>> with suppress(OSError), Path('doesnotexist').open() as f:
...     for line in f:
...         print(line)
... 
>>>
>>> with suppress(OSError):
...     Path('doesnotexist').unlink()
... 
>>> 

Đối với Pythons trước đó, bạn có thể tự cuộn

>>> root.is_file()
False
8 của riêng mình, nhưng không có
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 sẽ có nhiều dòng hơn. Tôi tin rằng đây thực sự là câu trả lời duy nhất không sử dụng
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 ở bất kỳ cấp độ nào trong Python có thể được áp dụng cho trước Python 3.4 vì nó sử dụng trình quản lý bối cảnh thay thế: thay vào đó:this actually is the only answer that doesn't use
>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
4 at any level in the Python
that can be applied to prior to Python 3.4 because it uses a context manager instead:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
0

Có lẽ dễ dàng hơn với một thử:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
1

Các tùy chọn khác không đáp ứng yêu cầu "mà không cần thử":

isfile

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
2

Từ các tài liệu:

is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
6

Trả về đúng nếu đường dẫn là một tệp thông thường hiện có. Điều này theo các liên kết tượng trưng, ​​vì vậy cả

is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
7 và
is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
8 đều có thể đúng cho cùng một đường dẫn.

Nhưng nếu bạn kiểm tra nguồn của chức năng này, bạn sẽ thấy nó thực sự sử dụng câu lệnh thử:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
3
>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
4

Tất cả những gì nó đang làm là sử dụng đường dẫn đã cho để xem liệu nó có thể nhận được số liệu thống kê trên đó không, bắt

is_file(self)
    Whether this path is a regular file (also True for symlinks pointing
    to regular files).
9 và sau đó kiểm tra xem đó có phải là tệp không nếu nó không tăng ngoại lệ.

Nếu bạn có ý định làm điều gì đó với tệp, tôi sẽ đề nghị trực tiếp thử nó với một thử nghiệm để tránh điều kiện cuộc đua:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
5

os.access

Có sẵn cho Unix và Windows là

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
0, nhưng để sử dụng, bạn phải vượt qua cờ và nó không phân biệt giữa các tệp và thư mục. Điều này được sử dụng nhiều hơn để kiểm tra xem người dùng gọi thực sự có quyền truy cập trong môi trường đặc quyền nâng cao không:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
6

Nó cũng bị các vấn đề tình trạng chủng tộc tương tự như

>>> from pathlib import Path
>>> root = Path('/')
>>> root.exists()
True
2. Từ các tài liệu:

Lưu ý: Sử dụng Access () để kiểm tra xem người dùng có được ủy quyền, ví dụ: Mở một tệp trước khi thực sự thực hiện bằng cách sử dụng Open () tạo lỗ bảo mật, bởi vì người dùng có thể khai thác khoảng thời gian ngắn giữa việc kiểm tra và mở tệp để thao tác nó. Nó thích hợp hơn để sử dụng các kỹ thuật EAFP. Ví dụ:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
7

được viết tốt hơn như:

>>> import os
>>> os.path.isfile('/')
False
>>> os.path.isfile('/initrd.img')
True
>>> os.path.isfile('/doesnotexist')
False
8

Tránh sử dụng

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
0. Đây là một chức năng cấp thấp có nhiều cơ hội cho lỗi người dùng hơn các đối tượng và chức năng cấp cao hơn được thảo luận ở trên.

Phê bình về một câu trả lời khác:

Một câu trả lời khác nói điều này về

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
0:

Tôi thích cái này vì dưới mui xe, nó gọi API gốc (thông qua "$ {python_src_dir} /modules/posixmodule.c"), nhưng nó cũng mở một cổng cho các lỗi người dùng có thể và nó không phải là pythonic như các biến thể khác :

Câu trả lời này cho biết nó thích một phương pháp không giống, dễ bị lỗi, không có lý do. Nó dường như khuyến khích người dùng sử dụng API cấp thấp mà không hiểu chúng.

Nó cũng tạo ra một trình quản lý bối cảnh, bằng cách trả lại vô điều kiện

>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
4, cho phép tất cả các trường hợp ngoại lệ (bao gồm
>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
5 và
>>> import tempfile
>>> file = tempfile.NamedTemporaryFile()
>>> filepathobj = Path(file.name)
>>> filepathobj.is_file()
True
>>> filepathobj.exists()
True
6!) Để vượt qua âm thầm, đó là một cách tốt để che giấu lỗi.

Điều này dường như khuyến khích người dùng áp dụng các hoạt động kém.

Làm thế nào để bạn kiểm tra xem một tệp có tồn tại hay không?

Kiểm tra xem tệp có tồn tại bằng HĐH không ...
đường dẫn. tồn tại (đường dẫn) - trả về true nếu đường dẫn là tệp, thư mục hoặc symlink hợp lệ ..
đường dẫn. ISFILE (PATH) - Trả về đúng nếu đường dẫn là tệp thông thường hoặc liên kết với tệp ..
đường dẫn. ISDIR (đường dẫn) - Trả về đúng nếu đường dẫn là thư mục hoặc liên kết với thư mục ..

Làm cách nào để tìm kiếm một tệp trong Python?

Python có thể tìm kiếm tên tệp trong một đường dẫn được chỉ định của HĐH.Điều này có thể được thực hiện bằng cách sử dụng HĐH mô -đun với các chức năng đi bộ ().Điều này sẽ lấy một đường dẫn cụ thể làm đầu vào và tạo ra 3-tuple liên quan đến dirpath, dirnames và tên tệp.using the module os with the walk() functions. This will take a specific path as input and generate a 3-tuple involving dirpath, dirnames, and filenames.

Làm cách nào để kiểm tra xem một tệp tồn tại mà không có ngoại lệ?

Để kiểm tra xem một đối tượng đường dẫn có tồn tại độc lập về việc đó là tệp hay thư mục hay không, hãy sử dụng my_path.exists ().my_path.use my_path. exists() . my_path.

Làm thế nào để bạn kiểm tra xem một thư mục có chứa một tệp trong Python không?

Mô -đun HĐH trong Python cung cấp các chức năng để tương tác với hệ điều hành.Mô -đun này cung cấp một cách di động để sử dụng chức năng phụ thuộc hệ điều hành.Bây giờ bằng cách gọi phương thức listDir (), chúng ta có thể nhận được một danh sách tất cả các tệp có trong thư mục.by calling listdir() method, we can get a list of all files present in the directory.