Làm thế nào để xóa một tập tin hoặc thư mục?


Câu trả lời:


3345

Pathcác đối tượng từ pathlibmô-đun Python 3.4+ cũng hiển thị các phương thức cá thể sau:


5
os.rmdir () trên Windows cũng xóa liên kết tượng trưng thư mục ngay cả khi thư mục đích không trống
Lu55

8
Nếu tệp không tồn tại, hãy os.remove()ném một ngoại lệ, do đó có thể cần phải kiểm tra os.path.isfile()trước hoặc bọc lại try.
Ben Crowell

2
Tôi muốn Path.unlink 1 / được đệ quy 2 / thêm tùy chọn để bỏ qua FileNotfoundError.
Jérôme

7
chỉ để hoàn thành ... ngoại lệ được ném bởi os.remove()nếu một tập tin không tồn tại là FileNotFoundError.
PedroA

os.remove() mất nhiều đối số để xóa nhiều tệp hoặc bạn gọi nó mỗi lần cho mỗi tệp?
user742864

292

Cú pháp Python để xóa một tập tin

import os
os.remove("/tmp/<file_name>.txt")

Hoặc là

import os
os.unlink("/tmp/<file_name>.txt")

Hoặc là

Thư viện pathlib cho phiên bản Python> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Đường dẫn.unlink (mất_ok = Sai)

Phương pháp hủy liên kết được sử dụng để loại bỏ các tập tin hoặc liên kết Symbolik.

Nếu mất_ok là sai (mặc định), FileNotFoundError được nâng lên nếu đường dẫn không tồn tại.
Nếu mất_ok là đúng, các ngoại lệ FileNotFoundError sẽ bị bỏ qua (hành vi tương tự như lệnh POSIX rm -f).
Thay đổi trong phiên bản 3.8: Tham số thiếu_ok đã được thêm.

Thực hành tốt nhất

  1. Đầu tiên, kiểm tra xem tập tin hoặc thư mục có tồn tại hay không sau đó chỉ xóa tập tin đó. Điều này có thể đạt được theo hai cách:
    a. os.path.isfile("/path/to/file")
    b. Sử dụngexception handling.

VÍ DỤ choos.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

Xử lý ngoại lệ

#!/usr/bin/python
import os

## Get input ##
myfile= raw_input("Enter file name to delete: ")

## Try to delete the file ##
try:
    os.remove(myfile)
except OSError as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

ĐẦU RA TRÁCH NHIỆM

Nhập tên tệp cần xóa: demo.txt
Lỗi: demo.txt - Không có tệp hoặc thư mục như vậy.

Nhập tên tệp cần xóa: rrr.txt
Lỗi: rrr.txt - Hoạt động không được phép.

Nhập tên tệp cần xóa: foo.txt

Cú pháp Python để xóa một thư mục

shutil.rmtree()

Ví dụ như shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

13
Việc xử lý ngoại lệ được khuyến nghị khi kiểm tra vì tệp có thể bị xóa hoặc thay đổi giữa hai dòng (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Xem Câu hỏi thường gặp về Python docs.python.org/3/glossary.html#term-eafp
Éric Araujo

84

Sử dụng

shutil.rmtree(path[, ignore_errors[, onerror]])

(Xem tài liệu đầy đủ về tắt máy ) và / hoặc

os.remove

os.rmdir

(Tài liệu đầy đủ về os .)


6
Vui lòng thêm giao diện pathlib (mới kể từ Python 3.4) vào danh sách của bạn.
Paebbels

38

Đây là một chức năng mạnh mẽ sử dụng cả hai os.removeshutil.rmtree:

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(path):
        os.remove(path)  # remove the file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

8
Tức là 8 dòng mã để mô phỏng remove(path);cuộc gọi ISO C.
Kaz

2
@Kaz đồng ý khó chịu, nhưng có gỡ bỏ thỏa thuận với cây không? :-)
Ciro Santilli 冠状 病毒 审查 六四 事件

6
os.path.islink(file_path): một lỗi, nên làos.path.islink(path):
Neo li

32

Bạn có thể sử dụng pathlibmô-đun tích hợp (yêu cầu Python 3.4+, nhưng có backport cho các phiên bản cũ hơn trên PyPI : pathlib, pathlib2).

Để xóa một tập tin có unlinkphương pháp:

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

Hoặc rmdirphương pháp để loại bỏ một thư mục trống :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

2
Điều gì về một thư mục không trống mặc dù?
Pranaas

@Pranasas Thật không may, dường như không có gì (nguyên bản) trong pathlibđó có thể xử lý xóa các thư mục không trống. Tuy nhiên bạn có thể sử dụng shutil.rmtree. Nó đã được đề cập trong một số câu trả lời khác vì vậy tôi không bao gồm nó.
MSeifert

29

Làm cách nào để xóa một tệp hoặc thư mục trong Python?

Đối với Python 3, để loại bỏ tệp và thư mục riêng lẻ, hãy sử dụng các phương thức unlinkvà đối tượng tương ứng:rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Lưu ý rằng bạn cũng có thể sử dụng các đường dẫn tương đối với Pathcác đối tượng và bạn có thể kiểm tra thư mục làm việc hiện tại của mình với Path.cwd.

Để xóa các tệp và thư mục riêng lẻ trong Python 2, hãy xem phần được gắn nhãn bên dưới.

Để xóa một thư mục có nội dung, hãy sử dụng shutil.rmtreevà lưu ý rằng điều này có sẵn trong Python 2 và 3:

from shutil import rmtree

rmtree(dir_path)

Trình diễn

Mới trong Python 3.4 là Pathđối tượng.

Chúng ta hãy sử dụng một để tạo một thư mục và tập tin để chứng minh việc sử dụng. Lưu ý rằng chúng tôi sử dụng /để tham gia các phần của đường dẫn, điều này giải quyết các vấn đề giữa các hệ điều hành và các vấn đề từ việc sử dụng dấu gạch chéo ngược trên Windows (trong đó bạn cần tăng gấp đôi dấu gạch chéo ngược của bạn như \\hoặc sử dụng chuỗi thô, như r"foo\bar")

from pathlib import Path

# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()

file_path = directory_path / 'file'
file_path.touch()

và bây giờ:

>>> file_path.is_file()
True

Bây giờ hãy xóa chúng đi. Đầu tiên các tập tin:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

Chúng tôi có thể sử dụng globalbing để xóa nhiều tệp - trước tiên hãy tạo một vài tệp cho việc này:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

Sau đó, chỉ cần lặp đi lặp lại trên mô hình toàn cầu:

>>> for each_file_path in directory_path.glob('*.my'):
...     print(f'removing {each_file_path}')
...     each_file_path.unlink()
... 
removing ~/directory/foo.my
removing ~/directory/bar.my

Bây giờ, chứng minh loại bỏ thư mục:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

Điều gì xảy ra nếu chúng ta muốn xóa một thư mục và mọi thứ trong đó? Đối với trường hợp sử dụng này, sử dụngshutil.rmtree

Hãy tạo lại thư mục và tệp của chúng tôi:

file_path.parent.mkdir()
file_path.touch()

và lưu ý rằng rmdirthất bại trừ khi nó trống, đó là lý do tại sao rmtree rất tiện lợi:

>>> directory_path.rmdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

Bây giờ, nhập rmtree và chuyển thư mục cho funtion:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

và chúng ta có thể thấy toàn bộ sự việc đã bị xóa:

>>> directory_path.exists()
False

Con trăn 2

Nếu bạn đang dùng Python 2, có một backport của mô-đun pathlib được gọi là pathlib2 , có thể được cài đặt bằng pip:

$ pip install pathlib2

Và sau đó bạn có thể đặt bí danh cho thư viện pathlib

import pathlib2 as pathlib

Hoặc chỉ cần nhập trực tiếp Pathđối tượng (như đã trình bày ở đây):

from pathlib2 import Path

Nếu quá nhiều, bạn có thể xóa các tệp có os.removehoặcos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

hoặc là

unlink(join(expanduser('~'), 'directory/file'))

và bạn có thể xóa các thư mục với os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Lưu ý rằng cũng có một os.removedirs- nó chỉ loại bỏ các thư mục trống theo cách đệ quy, nhưng nó có thể phù hợp với trường hợp sử dụng của bạn.


rmtree(directory_path)hoạt động trong python 3.6.6 nhưng không hoạt động trong python 3.5.2 - bạn cần rmtree(str(directory_path)))ở đó.
Stein

4
import os

folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)

for f in fileList:
    filePath = folder + '/'+f

    if os.path.isfile(filePath):
        os.remove(filePath)

    elif os.path.isdir(filePath):
        newFileList = os.listdir(filePath)
        for f1 in newFileList:
            insideFilePath = filePath + '/' + f1

            if os.path.isfile(insideFilePath):
                os.remove(insideFilePath)

1
Điều này sẽ chỉ xóa các tệp bên trong thư mục và các thư mục con giữ nguyên cấu trúc thư mục ..
Lalithesh

4

shutil.rmtree là hàm không đồng bộ, vì vậy nếu bạn muốn kiểm tra khi hoàn thành, bạn có thể sử dụng vòng lặp while ...

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1
shutil.rmtreekhông được coi là không đồng bộ. Tuy nhiên, nó có thể xuất hiện trên Windows với các trình quét vi-rút can thiệp.
mhsmith

@mhsmith Máy quét vi-rút ? Đó có phải là suy đoán hoang dã, hoặc bạn thực sự biết rằng chúng có thể gây ra hiệu ứng này? Làm thế nào trên trái đất mà làm việc nếu như vậy?
Đánh dấu Amery

2

Để xóa các tập tin:

os.unlink(path, *, dir_fd=None)

hoặc là

os.remove(path, *, dir_fd=None)

Cả hai chức năng đều giống nhau về mặt ngữ nghĩa. Hàm này loại bỏ (xóa) đường dẫn tệp. Nếu đường dẫn không phải là một tập tin và nó là thư mục, thì ngoại lệ được đưa ra.

Để xóa các thư mục:

shutil.rmtree(path, ignore_errors=False, onerror=None)

hoặc là

os.rmdir(path, *, dir_fd=None)

Để loại bỏ toàn bộ cây thư mục, shutil.rmtree()có thể được sử dụng. os.rmdirchỉ hoạt động khi thư mục trống và tồn tại.

Để xóa các thư mục đệ quy về phía cha mẹ:

os.removedirs(name)

Nó tự xóa mọi thư mục cha mẹ trống cho đến khi cha mẹ có một số nội dung

Ví dụ. os.remondirs ('abc / xyz / pqr') sẽ xóa các thư mục theo thứ tự 'abc / xyz / pqr', 'abc / xyz' và 'abc' nếu chúng trống.

Để biết thêm thông tin kiểm tra doc chính thức: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs


1

Để xóa tất cả các tệp trong thư mục

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

Để xóa tất cả các thư mục trong một thư mục

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))

0

Để tránh sự cố TOCTOU được đánh dấu bằng nhận xét của Éric Araujo , bạn có thể bắt ngoại lệ để gọi phương thức chính xác:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

shutil.rmtree()sẽ chỉ xóa các thư mục và os.remove()hoặc os.unlink()sẽ chỉ xóa các tập tin.


shutil.rmtree()loại bỏ không chỉ thư mục mà còn cả nội dung của nó.
Tiago Martins Peres

-1

Tôi khuyên bạn nên sử dụng subprocessnếu viết một mã đẹp và dễ đọc là tách trà của bạn:

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

Và nếu bạn không phải là kỹ sư phần mềm, thì có thể cân nhắc sử dụng Jupyter; bạn chỉ cần gõ các lệnh bash:

!rm -r my_dir

Theo truyền thống, bạn sử dụng shutil:

import shutil
shutil.rmtree(my_dir) 

3
Quá trình con là thực hành cần tránh
dlewin

3
Tôi sẽ không đề nghị subprocesscho điều này. shutil.rmtreeLiệu rm -r's công việc tốt, có thêm tiền thưởng làm việc trên Windows.
Mark Amery
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.