【问题标题】:How to delete a file by extension in Python?如何在 Python 中按扩展名删除文件?
【发布时间】:2021-05-27 19:36:45
【问题描述】:

我只是想制作一个通过“.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/", 这不是完整路径吧?
  • 这是完整路径
  • 我猜你必须把路径和文件名放在一起才能删除。

标签: python


【解决方案1】:

您可以将路径设置为dir_name 变量,然后将os.path.join 用于您的os.remove

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))

【讨论】:

  • 请注意,使用 dir 作为变量名是不好的做法,file 也是如此,因为它们也是内置函数。 docs.python.org/3/library/functions.html#dir
  • @borgr 我回滚了所有编辑,进行了一些更改并s/dir/dir_name/g。看起来我从一开始就有dir。那不应该在那里,很好。
  • 看起来sys 没有必要。
  • @IvanCastro 是的。感谢您的提醒。改变了。
【解决方案2】:

对于此操作,您需要将文件名附加到文件路径,以便命令知道您正在查看的文件夹。

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

import sys
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 ) )

【讨论】:

  • 你不需要像os.listdir那样做from os import listdir
【解决方案3】:

避免反复加入自己的替代方法:使用glob 模块加入一次,然后让它直接返回路径。

import glob
import os

dir = "/Users/ben/downloads/"

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

【讨论】:

    【解决方案4】:

    在这个问题上留下我的两分钱:如果你想成为chic,你可以使用glob package中的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)
    

    【讨论】:

      【解决方案5】:

      我认为您可以使用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()
      

      【讨论】:

        【解决方案6】:
        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 输出中。您必须附加它以从所述函数返回的列表中引用文件。

        【讨论】:

          【解决方案7】:

          将目录添加到文件名

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-19
            • 1970-01-01
            • 1970-01-01
            • 2012-06-29
            • 1970-01-01
            • 2012-10-31
            • 2016-02-18
            相关资源
            最近更新 更多