如何删除文件或文件夹?
当前回答
os.remove()删除文件。os.rmdir()删除空目录。shutil.rmtree()删除目录及其所有内容。
Python 3.4+pathlib模块中的路径对象还公开了以下实例方法:
pathlib.Path.unlink()删除文件或符号链接。pathlib.Path.rmdir()删除空目录。
其他回答
您可以使用内置的pathlib模块(需要Python 3.4+,但PyPI上有旧版本的后端:pathlib、pathlib2)。
要删除文件,可以使用unlink方法:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
或使用rmdir方法删除空文件夹:
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
如何在Python中删除文件或文件夹?
对于Python 3,要单独删除文件和目录,请分别使用unlink和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
请注意,您也可以对Path对象使用相对路径,并且可以使用Path.cwd检查当前工作目录。
有关在Python 2中删除单个文件和目录的信息,请参阅下面标记的部分。
要删除包含内容的目录,请使用shutil.rmtree,并注意这在Python 2和3中可用:
from shutil import rmtree
rmtree(dir_path)
集会示威
Python 3.4中的新功能是Path对象。
让我们使用一个来创建一个目录和文件来演示用法。请注意,我们使用/来连接路径的部分,这可以解决操作系统之间的问题以及在Windows上使用反斜杠的问题(您需要将反斜杠加倍,如\\或使用原始字符串,如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()
现在:
>>> file_path.is_file()
True
现在让我们删除它们。首先文件:
>>> file_path.unlink() # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False
我们可以使用globbing删除多个文件-首先让我们为此创建几个文件:
>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()
然后只需遍历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
现在,演示如何删除目录:
>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False
如果我们想删除目录和其中的所有内容呢?对于此用例,请使用shutil.rmtree
让我们重新创建目录和文件:
file_path.parent.mkdir()
file_path.touch()
注意,除非rmdir为空,否则它会失败,这就是为什么rmtree如此方便的原因:
>>> 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'
现在,导入rmtree并将目录传递给函数:
from shutil import rmtree
rmtree(directory_path) # remove everything
我们可以看到整个事情都被删除了:
>>> directory_path.exists()
False
Python 2
如果您使用的是Python 2,则有一个名为pathlib2的pathlib模块的后端,可以使用pip安装:
$ pip install pathlib2
然后可以将库别名为pathlib
import pathlib2 as pathlib
或者直接导入Path对象(如下所示):
from pathlib2 import Path
如果太多,可以使用os.remove或os.unlink删除文件
from os import unlink, remove
from os.path import join, expanduser
remove(join(expanduser('~'), 'directory/file'))
or
unlink(join(expanduser('~'), 'directory/file'))
并且可以使用os.rmdir删除目录:
from os import rmdir
rmdir(join(expanduser('~'), 'directory'))
注意,还有一个os.removedirs-它只递归地删除空目录,但可能适合您的用例。
如果您喜欢编写一段漂亮且可读的代码,我建议使用子流程:
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
如果你不是软件工程师,那么可以考虑使用Jupyter;您可以简单地键入bash命令:
!rm -r my_dir
传统上,您使用shutil:
import shutil
shutil.rmtree(my_dir)
Use
shutil.rmtree(path[, ignore_errors[, onerror]])
(参见shutil的完整文档)和/或
os.remove
and
os.rmdir
(操作系统的完整文档)
这是我删除目录的功能。“路径”需要完整的路径名。
import os
def rm_dir(path):
cwd = os.getcwd()
if not os.path.exists(os.path.join(cwd, path)):
return False
os.chdir(os.path.join(cwd, path))
for file in os.listdir():
print("file = " + file)
os.remove(file)
print(cwd)
os.chdir(cwd)
os.rmdir(os.path.join(cwd, path))