Hướng dẫn python check if path contains directory - python kiểm tra xem đường dẫn có chứa thư mục không

Tôi thích viết một hệ thống mẫu bằng Python, cho phép bao gồm các tệp.

e.g.

    This is a template
    You can safely include files with safe_include`othertemplate.rst`

Như bạn đã biết, bao gồm các tập tin có thể nguy hiểm. Ví dụ: nếu tôi sử dụng hệ thống mẫu trong một ứng dụng web cho phép người dùng tạo các mẫu của riêng họ, họ có thể làm điều gì đó giống như

I want your passwords: safe_include`/etc/password`

Vì vậy, tôi phải giới hạn việc đưa các tệp vào các tệp ví dụ như trong một thư mục con nhất định (ví dụ:

I want your passwords: safe_include`/etc/password`
1)

Câu hỏi là bây giờ: Làm thế nào tôi có thể kiểm tra, liệu

I want your passwords: safe_include`/etc/password`
2 có nằm trong thư mục con của
I want your passwords: safe_include`/etc/password`
1 không?

Mã sau có hoạt động và được bảo mật không?

import os.path

def in_directory(file, directory, allow_symlink = False):
    #make both absolute    
    directory = os.path.abspath(directory)
    file = os.path.abspath(file)

    #check whether file is a symbolic link, if yes, return false if they are not allowed
    if not allow_symlink and os.path.islink(file):
        return False

    #return true, if the common prefix of both is equal to directory
    #e.g. /a/b/c/d.rst and directory is /a/b, the common prefix is /a/b
    return os.path.commonprefix([file, directory]) == directory

Miễn là

I want your passwords: safe_include`/etc/password`
4 là sai, tôi nghĩ vậy. Cho phép Symlinks tất nhiên sẽ làm cho nó không an toàn nếu người dùng có thể tạo các liên kết như vậy.

Cập nhật - Giải pháp Mã ở trên không hoạt động, nếu các thư mục trung gian là các liên kết tượng trưng. Để ngăn chặn điều này, bạn phải sử dụng

I want your passwords: safe_include`/etc/password`
5 thay vì
I want your passwords: safe_include`/etc/password`
6.
The code above does not work, if intermediate directories are symbolic links. To prevent this, you have to use
I want your passwords: safe_include`/etc/password`
5 instead of
I want your passwords: safe_include`/etc/password`
6.

CẬP NHẬT: Thêm một thư mục Trailing / vào để giải quyết vấn đề với CommonPrefix () reorx đã chỉ ra. adding a trailing / to directory to solve the problem with commonprefix() Reorx pointed out.

Điều này cũng làm cho

I want your passwords: safe_include`/etc/password`
4 không cần thiết khi các liên kết symlink được mở rộng đến đích thực sự của chúng

import os.path

def in_directory(file, directory):
    #make both absolute    
    directory = os.path.join(os.path.realpath(directory), '')
    file = os.path.realpath(file)

    #return true, if the common prefix of both is equal to directory
    #e.g. /a/b/c/d.rst and directory is /a/b, the common prefix is /a/b
    return os.path.commonprefix([file, directory]) == directory

Python tồn tại phương thức () được sử dụng để kiểm tra xem tệp hoặc thư mục cụ thể có tồn tại hay không. Nó cũng được sử dụng để kiểm tra xem một đường dẫn có đề cập đến bất kỳ mô tả tệp mở nào hay không. Nó trả về giá trị boolean true nếu tệp tồn tại và trả về sai. Nó được sử dụng với mô -đun HĐH và mô -đun phụ OS.Path làm OS.Path.exists (đường dẫn). method is used to check whether specific file or directory exists or not. It is also used to check if a path refers to any open file descriptor or not. It returns boolean value true if file exists and returns false otherwise. It is used with os module and os.path sub module as os.path.exists(path).

Trong tệp Python này tồn tại hướng dẫn, chúng ta sẽ tìm hiểu cách xác định xem một tệp (hoặc thư mục) có tồn tại bằng Python hay không. Để kiểm tra xem tệp có tồn tại Python hay không, chúng tôi sử dụng kiểm tra python thư viện tích hợp nếu tệp có tồn tại chức năng không.

Có nhiều cách khác nhau để xác minh tệp hoặc kiểm tra Python nếu thư mục tồn tại, sử dụng các chức năng như được liệt kê dưới đây.

  • Cách kiểm tra xem một tệp có tồn tại trong Python bằng Os.Path.exists ()
  • os.path.isfile()
  • os.path.isdir()
  • pathlibPath.exists()

Cách kiểm tra xem một tệp có tồn tại trong Python bằng Os.Path.exists ()

Sử dụng Path.Exists Bạn có thể nhanh chóng kiểm tra xem tệp hoặc thư mục có tồn tại không. Dưới đây là các bước để kiểm tra Python có tồn tại hay không:

Bước 1) Nhập mô -đun OS.Path

Trước khi bạn chạy mã, điều quan trọng là bạn phải nhập mô -đun OS.Path.

import os.path
from os import path

Bước 2) Sử dụng Path.Exists () Funtion

Bây giờ, sử dụng hàm path.exists () để kiểm tra python nếu một tệp tồn tại.

path.exists("guru99.txt")

Bước 3) Chạy mã được đưa ra dưới đây

Đây là mã hoàn chỉnh

import os.path
from os import path

def main():

   print ("File exists:"+str(path.exists('guru99.txt')))
   print ("File exists:" + str(path.exists('career.guru99.txt')))
   print ("directory exists:" + str(path.exists('myDirectory')))

if __name__== "__main__":
   main()

Trong trường hợp của chúng tôi, chỉ có tệp Guru99.txt được tạo trong thư mục làm việc

Output:

Tệp tồn tại: Tệp true tồn tại: Thư mục sai tồn tại: Sai
File exists: False
directory exists: False

Python isfile ()

Phương thức python isfile () được sử dụng để tìm xem một đường dẫn nhất định có phải là một tệp thông thường hiện có hay không. Nó trả về một giá trị boolean true nếu đường dẫn cụ thể là một tệp hiện có hoặc nếu không nó sẽ trả về sai. Nó có thể được sử dụng bởi cú pháp: Os.Path.isfile (đường dẫn).Python isfile() method is used to find whether a given path is an existing regular file or not. It returns a boolean value true if the specific path is an existing file or else it returns false. It can be used by the syntax : os.path.isfile(path).

os.path.isfile()

Chúng ta có thể sử dụng lệnh isfile để kiểm tra xem một đầu vào đã cho có phải là tệp hay không.

import os.path
from os import path

def main():

	print ("Is it File?" + str(path.isfile('guru99.txt')))
	print ("Is it File?" + str(path.isfile('myDirectory')))
if __name__== "__main__":
	main()

Output:

Nó có phải là tập tin không? Đúng là tập tin? Sai
Is it File? False

os.path.isdir()

Nếu chúng tôi muốn xác nhận rằng một đường dẫn đã cho đến một thư mục, chúng tôi có thể sử dụng hàm os.path.dir ()

import os.path
from os import path

def main():

   print ("Is it Directory?" + str(path.isdir('guru99.txt')))
   print ("Is it Directory?" + str(path.isdir('myDirectory')))

if __name__== "__main__":
   main()

Output:

Nó có phải là thư mục không? Sai là thư mục? ĐÚNG VẬY
Is it Directory? True

pathlibpath.exists () cho Python 3.4

Các phiên bản Python 3.4 trở lên có mô -đun Pathlib để xử lý với đường dẫn hệ thống tệp. Nó sử dụng cách tiếp cận hướng đối tượng để kiểm tra Python nếu thư mục có tồn tại hay không.

import pathlib
file = pathlib.Path("guru99.txt")
if file.exists ():
    print ("File exist")
else:
    print ("File not exist")

Output:

Tập tin tồn tại

Hoàn thành mã

Đây là mã hoàn chỉnh

I want your passwords: safe_include`/etc/password`
0

Output:

Trong trường hợp của chúng tôi, chỉ có tệp Guru99.txt được tạo trong thư mục làm việc
Item is a file: True
Item is a directory: False

Tệp tồn tại: Tệp true tồn tại: Thư mục sai tồn tại: Sai

  • Python isfile ()
  • Phương thức python isfile () được sử dụng để tìm xem một đường dẫn nhất định có phải là một tệp thông thường hiện có hay không. Nó trả về một giá trị boolean true nếu đường dẫn cụ thể là một tệp hiện có hoặc nếu không nó sẽ trả về sai. Nó có thể được sử dụng bởi cú pháp: Os.Path.isfile (đường dẫn).
  • Chúng ta có thể sử dụng lệnh isfile để kiểm tra xem một đầu vào đã cho có phải là tệp hay không.
  • Nó có phải là tập tin không? Đúng là tập tin? Sai

Nếu chúng tôi muốn xác nhận rằng một đường dẫn đã cho đến một thư mục, chúng tôi có thể sử dụng hàm os.path.dir ()Python Tutorial for Beginners: Learn Programming Basics [PDF]