如何在Python中按文件扩展名删除文件?

55

我只是闲着无聊试图编写一个可以删除以“.zip”为扩展名的项目的脚本。

import sys
import os
from os import listdir

test=os.listdir("/Users/ben/downloads/")

for item in test:
    if item.endswith(".zip"):
        os.remove(item)

每次运行脚本时,我都会得到:

OSError: [Errno 2] No such file or directory: 'cities1000.zip'

cities1000.zip显然是我下载文件夹中的一个文件。

我在这里做错了什么?是os.remove需要文件的完整路径吗?如果是这个问题,那么在不完全重写脚本的情况下,我该如何解决呢?


os.listdir("/Users/ben/downloads/", 这不是完整的路径,对吗? - Yu Zhang
这是完整路径。 - stephan
我猜你需要将路径和文件名放在一起进行删除。 - Klaus D.
7个回答

100
你可以将路径设置为一个名为dir_name的变量,然后在os.remove中使用os.path.join
import os

dir_name = "/Users/ben/downloads/"
test = os.listdir(dir_name)

for item in test:
    if item.endswith(".zip"):
        os.remove(os.path.join(dir_name, item))

3
注意,将dir作为变量名是一种不好的习惯,同样file也是如此,因为它们也是Python内置函数之一。详见https://docs.python.org/3/library/functions.html#dir。 - borgr
@borgr 我回滚了所有的编辑,做了一些修改并且使用 s/dir/dir_name/g。看起来一开始我就有 dir。那个不应该在那里,你发现得好。 - idjaw
1
似乎 sys 不是必需的。 - Ivan Castro
@IvanCastro 嗯,谢谢提醒。已更改。 - idjaw

13

在进行此操作时,您需要将文件名附加到文件路径上,以便命令知道您要查看哪个文件夹。

您可以使用Python中的os.path.join命令正确且可移植地执行此操作。
例如:

import os

directory = "/Users/ben/downloads/"
test = os.listdir( directory )

for item in test:
    if item.endswith(".zip"):
        os.remove( os.path.join( directory, item ) )

1
你不需要做 from os import listdir,因为你已经在使用 os.listdir 了。 - ave
import sys 是用来做什么的? - Dut A.
@DutA。这个没用,我会把它编辑掉。感谢你指出来。 - Serdalis

11

另一种避免反复连接的方法:使用 glob 模块进行一次连接,然后让它直接返回路径。

import glob
import os

dir = "/Users/ben/downloads/"

for zippath in glob.iglob(os.path.join(dir, '*.zip')):
    os.remove(zippath)

3

我认为你可以使用 Pathlib -- 一种现代的方法,如下所示:

import pathlib


dir = pathlib.Path("/Users/ben/downloads/")
zip_files = dir.glob(dir / "*.zip")
for zf in zip_files:
    zf.unlink()

如果您想递归删除所有zip文件,只需这样写:

import pathlib


dir = pathlib.Path("/Users/ben/downloads/")
zip_files = dir.rglob(dir / "*.zip")  # recursively
for zf in zip_files:
    zf.unlink()

2

关于这个问题,我想提供我的两分建议:如果你想要更加时髦,可以使用来自glob包globiglob,如下所示:

import glob
import os

files_in_dir = glob.glob('/Users/ben/downloads/*.zip')
# or if you want to be fancy, you can use iglob, which returns an iterator:
files_in_dir = glob.iglob('/Users/ben/downloads/*.zip')

for _file in files_in_dir:
    print(_file) # just to be sure, you know how it is...
    os.remove(_file)

1
origfolder = "/Users/ben/downloads/"
test = os.listdir(origfolder)

for item in test:
    if item.endswith(".zip"):
        os.remove(os.path.join(origfolder, item))

os.listdir输出中不包含目录名。您需要将其附加到所述函数返回的列表中的引用文件。


0

在文件名前加上目录

os.remove("/Users/ben/downloads/" + item)

编辑:或者使用os.chdir更改当前工作目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接