Python 使用rm命令删除文件

Python 使用rm命令删除文件,python,file,delete-file,Python,File,Delete File,我要确保删除所需的文件。 我有类似的代码 dir="/some/path/" file = "somefile.txt" cmd_rm= "rm -rf "+dir + file os.system(cmd_rm) dir和文件值从数据库中获取。如何确保我永远不会运行rm-rf/ >在做代码> > RM- RF ? < P>之前,我应该检查哪些东西,因为它比你所尝试的要危险得多。 < P>首先,我建议你使用操作系统.Rebug()/和 OS.RMRDE()/函数来处理这样的事情。最终,您将获

我要确保删除所需的文件。 我有类似的代码

dir="/some/path/"
file = "somefile.txt"
cmd_rm= "rm -rf "+dir + file
os.system(cmd_rm)
dir
文件
值从数据库中获取。如何确保我永远不会运行
rm-rf/


<> >在做代码> > RM- RF ?

< P>之前,我应该检查哪些东西,因为它比你所尝试的要危险得多。

< P>首先,我建议你使用<代码>操作系统.Rebug()/<代码>和<代码> OS.RMRDE()/<代码>函数来处理这样的事情。最终,您将获得更多可移植代码,并减少检查命令返回的麻烦


要检查您正在有效地尝试删除的内容(您可能不想只检查“/”),您可以在生成的路径上使用一些正则表达式,或者只向从数据库返回的所有路径添加一个基本路径(取决于您正在做什么…。

如果您只想删除单个文件,请不要使用
-r
开关。此外,文件名中可能有空格

最好使用Python模块中的函数:

dirname = "/some/path/"
filename = "somefile.txt"
pathname = os.path.abspath(os.path.join(dirname, filename))
if pathname.startswith(dirname):
   os.remove(pathname)

将路径与目标目录进行规范化并将其与目标目录进行比较,可以避免使用“../../../etc/passwd”或类似的文件名。

有一个名为
shutil
的模块,提供类似shell的文件操作。如果要删除目录以及其中的所有文件和目录,请使用
shutil.rmtree


但是,它是用python实现的,因此如果要删除大量文件,生成rm可能会更快,但如果路径中有空间,则生成rm将失败。

使用
shutil.rmtree
,如Dave Kirby所说。如果要仅删除文件,请使用:

dir = "/some/path/" 
file = "somefile.txt" 
cmd = os.path.join(dir, file) 
shutil.rmtree(cmd) 
如果要删除目录,请使用:

dir = "/some/path/" 
file = "somefile.txt"  
shutil.rmtree(dir) 

如果文件是写保护的,请在运行此操作之前确保您具有写权限。

假设您的rm-rf不是随机的,而是您需要的命令,为什么不直接调用它呢?有一个lib允许与shell进行更大的集成,名为

PS确保您不是root用户和/或要求用户输入时格外小心。
而且,是的,吸烟可以避免递归删除单个文件;)

我认为你需要澄清你到底在问什么。你到底想做什么?我想投票支持你的shutil建议(,作为一个链接),但同时生成rm不需要因为空间等原因而失败(使用子流程模块,伙计!),而且速度几乎肯定不是问题(坦率地说,Python没有那么慢,而且我相当确定这个操作通常不会受到CPU的限制)。如果要使用正则表达式检查路径,请不要忘记执行类似于os.path.realpath和/或os.path.normpath的操作,以获得规范且易于处理的路径字符串(特别是,如果没有os.path.realpath()(或无法使用正则表达式完成的等效代码),则无法知道“foo/bar”实际上是指“/”)Hmmm,我在使用文件尝试rmtree时遇到了一个错误(尽管它可以使用dir)
OSError:[Errno 20]不是目录
@Pat-如何执行脚本,
python script.py
python./script.py
?通常类似于
python script.py
甚至
/script.py
,但在这种情况下,我实际上是在ipython REPL中执行的。
from sh import rm

path_to_delete = '/some/path'
if os.path.exists(path_to_delete):
    rm('-rf', path_to_delete)