Làm cách nào để xóa một tập tin hoặc thư mục trong Python?
Làm cách nào để xóa một tập tin hoặc thư mục trong Python?
Câu trả lời:
os.remove()
xóa một tập tin.
os.rmdir()
xóa một thư mục trống.
shutil.rmtree()
xóa một thư mục và tất cả nội dung của nó.
Path
các đối tượng từ pathlib
mô-đun Python 3.4+ cũng hiển thị các phương thức cá thể sau:
pathlib.Path.unlink()
xóa một tập tin hoặc liên kết tượng trưng.
pathlib.Path.rmdir()
xóa một thư mục trống.
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
.
os.remove()
nếu một tập tin không tồn tại là FileNotFoundError
.
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?
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()
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.
os.path.isfile("/path/to/file")
exception 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)
#!/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))
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
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))
Đây là một chức năng mạnh mẽ sử dụng cả hai os.remove
và shutil.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))
remove(path);
cuộc gọi ISO C.
os.path.islink(file_path):
một lỗi, nên làos.path.islink(path):
Bạn có thể sử dụng pathlib
mô-đ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ó unlink
phương pháp:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Hoặc rmdir
phương pháp để loại bỏ một thư mục trống :
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
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ó.
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 unlink
và đố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 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 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.rmtree
và lưu ý rằng điều này có sẵn trong Python 2 và 3:
from shutil import rmtree
rmtree(dir_path)
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 rmdir
thấ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
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.remove
hoặ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)))
ở đó.
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)
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')
shutil.rmtree
khô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.
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.
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.rmdir
chỉ hoạt động khi thư mục trống và tồn tại.
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
Để 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))
Để 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)
Vì 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ó.
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ể 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)
subprocess
cho điều này. shutil.rmtree
Liệu rm -r
's công việc tốt, có thêm tiền thưởng làm việc trên Windows.