Cách khắc phục PermissionError trong Python: [Errno 13] Permission Denied

beginner🐍 Python2026-04-26| Python 3.x trên Windows, Linux hoặc macOS

Error Message

PermissionError: [Errno 13] Permission denied: '/path/to/file'
#python#xử-lý-tệp#devops#khắc-phục-lỗi#windows

Tại sao điều này lại xảy ra?

Bạn đã bao giờ thử lưu một tệp trong Python nhưng chỉ nhận lại một loạt văn bản màu đỏ chưa? Lỗi này là cách Python thông báo rằng nó đã cố gắng "gõ cửa", nhưng Hệ điều hành (OS) đã từ chối mở.

Traceback (most recent call last):
  File "script.py", line 5, in <module>
    with open('/path/to/file', 'w') as f:
PermissionError: [Errno 13] Permission denied: '/path/to/file'

Hầu hết các trường hợp, logic code của bạn hoàn toàn ổn. Vấn đề thực sự nằm ở sự xung đột giữa script và các quy tắc bảo mật của máy tính. Nó thường bắt nguồn từ một trong bốn rào cản phổ biến sau.

Những nguyên nhân phổ biến nhất

  • Trỏ vào một thư mục: Bạn vô tình yêu cầu Python "ghi" vào một thư mục thay vì một tệp cụ thể (ví dụ: open('/Users/work/data') trong khi 'data' là một thư mục).
  • Tệp bị khóa: Một chương trình khác, như Excel hoặc trình đọc PDF, đang mở tệp và không cho phép Python can thiệp.
  • Thiếu quyền truy cập: Tài khoản người dùng của bạn không có quyền chỉnh sửa tệp trong các khu vực được hệ thống bảo vệ như C:\Program Files hoặc /etc.
  • Phần mềm bảo mật: Tính năng Ransomware Protection của Windows hoặc các công cụ diệt virus bên thứ ba đang coi script của bạn là một mối đe dọa tiềm tàng.

Cách khắc phục

1. Kiểm tra đường dẫn

Python không thể xử lý một thư mục như một tệp văn bản. Nếu đường dẫn của bạn trỏ đến một thư mục, hàm open() sẽ luôn thất bại. Hãy sử dụng một bước kiểm tra nhanh để xem bạn có cần thêm tên tệp vào hay không.

import os

path = './output_data'

if os.path.isdir(path):
    print(f"Cảnh báo: {path} là một thư mục!")
    # Tự động sửa đường dẫn
    path = os.path.join(path, 'results.csv')

2. Kiểm tra tệp bị khóa (Windows)

Windows nổi tiếng với việc bảo vệ các tệp đang mở. Nếu bạn cố gắng chỉnh sửa report.xlsx trong khi nó đang được mở bằng Excel, bạn sẽ gặp lỗi Errno 13. Hãy đóng ứng dụng đó và thử lại.

Bạn không chắc chương trình nào đang khóa tệp? Hãy sử dụng Resource Monitor:

  • Nhấn Ctrl + Shift + Esc để mở Task Manager, sau đó vào Performance > Open Resource Monitor.
  • Nhấp vào tab CPU.
  • Tìm kiếm tên tệp của bạn trong ô Associated Handles.
  • Nhấp chuột phải vào tiến trình gây lỗi và chọn End Process.

3. Sửa quyền truy cập trên Linux và macOS

Trên các hệ điều hành dựa trên Unix, các tệp thường thuộc về người dùng root hoặc một nhóm khác. Chạy lệnh ls -l trong terminal để xem quyền sở hữu hiện tại. Nếu bạn thấy -rw-r--r--, có thể bạn không có quyền 'ghi' (w) cần thiết.

Để cấp quyền cho chính mình, hãy thay đổi quyền sở hữu tệp thành người dùng hiện tại của bạn:

# Thay thế 'youruser' bằng tên người dùng thực tế của bạn
sudo chown youruser:youruser /path/to/your/project/data.json

# Hoặc cấp quyền đọc/ghi cho tất cả mọi người (hạn chế sử dụng)
chmod 666 /path/to/your/project/data.json

4. Vượt qua Ransomware Protection

Windows 10 và 11 có tính năng "Controlled Folder Access" để ngăn chặn các script độc hại mã hóa tệp của bạn. Thật không may, tính năng này cũng thường chặn các script Python hợp lệ. Nếu bạn đang cố gắng ghi vào thư mục Documents hoặc Desktop và bị từ chối, đây có thể là nguyên nhân.

  • Mở Windows Security và đi tới Virus & threat protection.
  • Chọn Manage ransomware protection.
  • Bạn có thể chuyển Controlled folder access sang Off, hoặc nhấp vào Allow an app through... và thêm python.exe vào danh sách loại trừ (whitelist).

Kiểm tra chủ động

Trước khi chạy một script xử lý dữ liệu nặng, hãy sử dụng đoạn mã nhỏ này để kiểm tra xem tệp có thực sự có quyền ghi hay không. Thà thất bại sớm còn hơn là bị treo sau một giờ xử lý.

import os

def check_access(file_path):
    if os.path.exists(file_path):
        return os.access(file_path, os.W_OK)
    return os.access(os.path.dirname(file_path), os.W_OK)

target = 'data/config.json'
if not check_access(target):
    print(f"Truy cập bị từ chối đối với {target}. Kiểm tra quyền hệ điều hành của bạn!")

Lưu ý khi triển khai

Khi chuyển script sang máy chủ Linux, các quyền ở dạng bát phân (octal) như 755 hoặc 644 có thể gây nhầm lẫn nhanh chóng. Tôi thường sử dụng Unix Permissions Calculator trên ToolCraft để hình dung những gì mình đang làm. Nó cung cấp một giao diện checkbox đơn giản để tạo ra chính xác lệnh chmod bạn cần, giúp ngăn ngừa các lỗ hổng bảo mật vô ý trong môi trường thực tế.

Để script của bạn chuyên nghiệp hơn, hãy luôn bao bọc các thao tác tệp trong khối try...except PermissionError thực hiện. Điều này cho phép bạn hiển thị một thông báo rõ ràng, hữu ích cho người dùng thay vì một thông báo lỗi (stack trace) khó hiểu.

Related Error Notes