Câu hỏi Xóa tệp hoặc thư mục


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


1459
2017-08-09 13:05


gốc




Các câu trả lời:


os.remove() sẽ xóa một tệp.

os.rmdir() sẽ xóa một thư mục trống.

shutil.rmtree() sẽ xóa một thư mục và tất cả nội dung của nó.


2358
2017-08-09 13:07



os.rmdir () trên Windows cũng loại bỏ liên kết biểu tượng thư mục ngay cả khi thư mục đích không trống - Lu55
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
Đó là pathlib.Path.unlink và pathlib.Path.rmdir để được chính xác. - m8mble
Có thể sử dụng os.system('rm -rf /directory_address/') thay vì tắt máy - W1ldworm
@ W1ldworm Đó là một lệnh POSIX, không phải là một lệnh Python. Nó sẽ không hoạt động trên Windows. - TakingItCasual


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

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

Hoặc là

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

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

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

THÍ DỤ cho os.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 TÍCH CỰC

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 nào như vậy.

Nhập tên tệp cần xóa: rrr.txt
Lỗi: rrr.txt - Thao tác 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))

105
2018-03-07 06:37



@ Zygimantas: Và anh ấy đã đưa ra câu trả lời tốt nhất. Vâng đặt ra, cho thấy làm thế nào để tránh những cạm bẫy phổ biến, và đưa ra các ví dụ tuyệt vời cho các kịch bản khác nhau. - Hans Goldman
Các except OSError, e: nên là except OSError as e:. - John
cảm ơn John Tôi sẽ thay đổi điều đó - anand tripathi


Sử dụng

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

(Xem tài liệu hoàn chỉnh về tắt máy) và / hoặc

os.remove

os.rmdir

(Hoàn tất tài liệu về hệ điều hành.)


61
2017-08-09 13:09



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


Để xóa tệp:

Bạn có thể dùng unlink hoặc là remove.

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

Hoặc là

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

Các hàm này loại bỏ (xóa) đường dẫn tệp. Nếu đường dẫn là một thư mục, OSError được nuôi dưỡng.

Trong Python 2, nếu đường dẫn không tồn tại, OSError với [Errno 2] (ENOENT) được nuôi dưỡng. Trong Python 3, FileNotFoundError với [Errno 2] (ENOENT) được nuôi dưỡng. Trong Python 3, bởi vì FileNotFoundError là một phân lớp của OSError, bắt người thứ hai sẽ bắt được cái cũ.

Để xóa thư mục:

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

rmdir Xóa (xóa) đường dẫn thư mục. Chỉ hoạt động khi thư mục trống, nếu không, OSError được nuôi dưỡng. Để xóa toàn bộ cây thư mục, shutil.rmtree() có thể được sử dụng.

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

shutil.rmtree Xóa toàn bộ cây thư mục. Đường dẫn phải trỏ đến một thư mục (nhưng không phải là một liên kết tượng trưng đến một thư mục).

Nếu ignore_errors là true, các lỗi do việc xóa không thành công sẽ bị bỏ qua và nếu sai hoặc bị bỏ qua, các lỗi như vậy được xử lý bằng cách gọi trình xử lý được chỉ định bởi onerror hoặc, nếu bị bỏ qua, chúng sẽ tăng ngoại lệ.

Xem thêm:

os.removedirs(name)

os.removedirs(name) Xóa thư mục đệ quy. Các công trình như rmdir () ngoại trừ, nếu thư mục lá được loại bỏ thành công, removeirs () cố gắng loại bỏ liên tiếp mọi thư mục cha được đề cập trong đường dẫn cho đến khi một lỗi được nâng lên (được bỏ qua, vì nó thường có nghĩa là thư mục cha không trống ).

Ví dụ: os.removedirs ('foo / bar / baz') trước tiên sẽ xóa thư mục 'foo / bar / baz', sau đó xóa 'foo / bar' và 'foo' nếu chúng trống.


50
2017-08-22 12:22





Tạo một chức năng cho các bạn.

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(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))

22
2018-01-22 09:40



I E. 8 dòng mã để mô phỏng ISO C remove(path); gọi điện. - Kaz


Bạn có thể sử dụng tích hợp sẵn pathlib module (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 tệp, có unlink phương pháp:

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

Hoặc là rmdir phương pháp để loại bỏ trống thư mục:

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

17
2017-08-06 20:10



Điều gì về một thư mục không có sản phẩm nào? - Pranasas
@Pranasas Thật không may có vẻ như không có gì (nguyên bản) trong pathlib có thể xử lý việc 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


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

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

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 đường dẫn tương đối với Path cá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 bằng Path.cwd.

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

Để xóa 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 vật.

Hãy sử dụng một để tạo một thư mục và tập tin để chứng minh cách 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 làm việc xung quanh 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 (nơi bạn cần phải tăng gấp đôi các dấu gạch chéo ngược của mình như \\ hoặc sử dụng các 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 tập tin:

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

Chúng ta có thể sử dụng globbing để loại bỏ nhiều tập tin - đầu tiên chúng ta hãy tạo một vài tập tin cho việc này:

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

Sau đó, chỉ cần lặp qua mẫu glob:

>>> 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ờ, thể hiện việc xóa 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, hãy sử dụng shutil.rmtree

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

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

và lưu ý rằng rmdir thất bại trừ khi nó trống rỗ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/excelsiora/directory'

Bây giờ, nhập rmtree và chuyển thư mục tới chức năng:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

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

>>> directory_path.exists()
False

Python 2

Nếu bạn đang sử 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ể bí danh thư viện pathlib

import pathlib2 as pathlib

Hoặc chỉ nhập trực tiếp Path đối tượng (như được minh họa ở đây):

from pathlib2 import Path

Nếu quá nhiều, bạn có thể xóa tệp bằng os.remove hoặc là os.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 thư mục bằng os.rmdir:

from os import rmdir

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

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


7
2018-02-12 01:44





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

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

3
2018-03-23 17:08



shutil.rmtree không được cho là không đồng bộ. Tuy nhiên, nó có thể xuất hiện trên Windows với máy quét vi-rút gây nhiễu. - mhsmith


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)

2
2017-10-25 12:49



Thao tác này sẽ chỉ xóa các tệp bên trong thư mục và thư mục con để lại cấu trúc thư mục còn nguyên vẹn .. - Lalithesh


Tôi khuyên bạn nên sử dụng subprocess nế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ể xem xét sử dụng Jupyter; bạn có thể chỉ cần gõ lệnh bash:

!rm -r my_dir

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

import shutil
shutil.rmtree(my_dir) 

0
2018-05-30 23:11