iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现删除windows下的长路径文件
  • 805
分享到

Python实现删除windows下的长路径文件

2024-04-02 19:04:59 805人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.文章背景2.使用 python 删除文件3.文件系统关于长路径文件的相关定义4.改造 Python 程序,删除长路径文件5.总结思考1.文章背景 近期,笔者所在公司的某业务系

1.文章背景

近期,笔者所在公司的某业务系统的存储临近极限,服务器马上就要跑不动了,由于该业务系统A包含多个子系统A1、A2、A3 ... An,这些子系统的中间存储文件由于设计原因,都存储在同一个父级目录之内,唯一不同的是,不同子系统产生的文件和文件夹的名字都以该子系统名开始。如A1子系统产生的文件命名方式均为A1xxxxxx, A2子系统产生的文件名均为A2xxxxx。现在要删除其中一些子系统的历史文件,以释放服务器空间,几十T的数据,存放在一起,手动删除肯定不显示,只能借助程序自动化实现了,使用什么呢?自然想到了python。其实单纯删文件这一个需求我认为不值得长篇阔论,但是其中遇到了一些特殊有趣的问题和一些有意思的解决方案,所以想与诸位分享一下,比如windows系统下的超长文件删除, 如从阅读官方英文文档寻找解决方案等等,下面进入正题。

2.使用 python 删除文件

使用python删除文件有很多方式,最直接也是最方便的方式就是调用内建函数:

  • os.remove()  删除文件
  • os.rmdir() 删除一个空文件夹
  • shutil.rmtree() 删除一个文件夹及该文件夹下所有内容(包括子目录及文件)

也就是,此问题的的解决方案,核心就是围绕上述三个函数打交道。转到我们遇到的问题,业务系统A包含多个子系统A1、A2、A3 ... An,这些子系统的中间存储文件由于设计原因,都存储在同一个父级目录之内,唯一不同的是,不同子系统产生的文件和文件夹的名字都以该子系统名开始。如A1子系统产生的文件命名方式均为A1xxxxxx, A2子系统产生的文件名均为A2xxxxx,现在的目的就是要在该删除指定子系统所产生的文件,保留其他子系统的文件。

将需求拆解下,实际上就是解决下列4个问题:1、怎么删除一个文件?2、怎样识别一个文件或文件夹是某个子系统产生的?3、如何判断一个路径是文件还是目录?4、如何定位所有指定的子系统产生的文件和文件夹?

对于问题1, 在本节开始就阐述过,使用 python 的内建函数进行删除即可:

os.remove("path") # 删除指定文件
os.rmdir("path") # 删除一个空文件夹
shutil.rmtree("path") #  删除一个文件夹及该文件夹下所有内容(包括子目录及文件)

对于问题2,由于特定子系统产生的文件和文件夹的命名方式都是固定的模式,如A1子系统产生的文件名均为A1xxxxx,故可通过关键字匹配的方式进行识别。一种可能的方式为:

if keyWords in filepath: # 如果文件名包含关键字keywords
    os.remove(filepath) # 删除文件
else:
    pass

对于问题3,由于删除目录和删除文件的方式不一致,故需要在删除前判断一个路径是目录还是文件,根据其类型选择合适的删除方式,这个在 python 中可以使用 **os.path.isdir()**之类的函数进行判断,主要是下列函数:

os.path.isdir("path") # 返回true则为目录,false则为文件
os.path.isfile("path") # 返回true则为文件,false则为目录

对于问题4,如何定位所有要删除的文件,这个问题实际上就是一个指定目录文件遍历的问题,即如何遍历一个指定目录的所有文件夹及文件。对于这个问题,一般有两种解决方案,一是深度优先遍历方式,一是广度优先遍历方式,两种方式在本例中效率是一致的,因为我们最终都要遍历所有的文件。另外,幸运的是,python实在是过于强大,其内建的函数已经帮助我们实现了一个广度优先目录遍历方法,及 os.walk("path") 方法,该方法就是遍历 path 目录下的所有文件及文件夹,一个典型的用法如下:

import os

path = "C:\\A\\"

for root, dirs, files in os.walk(path):
    print(root)
    print(dirs)
    print(files)

上例中,root 代表当前遍历到的路径,dirs 表示当前路径下所有的子目录, files 表示当前路径下的所有子文件。通过这种方式就能全部遍历指定目录了。

问题都分解开了,下面将问题组合一下就完成代码实现.

最终的代码实现为:

import os
import shutil

path = "C:\\A\\"
keyword = "A1"

for root, dirs, files in os.walk(path):
    for dir in dirs:
        if keyword in dir:
            rmpath = os.path.join(root, dir)
            print("删除文件夹: %s" % rmpath)
            shutil.rmtree(rmpath)
    for file in files:
        if keyword in file:
            rmpath = os.path.join(root, file)
            print("删除文件: %s" % rmpath)
            os.remove(rmpath)

即通过广度优先方式(os.walk())遍历指定目录,逐个判断该目录下所有子目录和文件是否满足关键字条件,满足就删除。

运行效果为:

看似需求到此基本上就很好的解决了,但是实际测试中发现有的很深的目录却没有删除,删除该目录时报了一个错,错误描述如下:

Unexpected error: (< type 'exceptions.windowsError'>, WindowsError(3, 'The system cannot find the path specified'), < traceback object at 0x0000000002714F88>)

大致意思就是python找不到这个路径,可是为什么呢?为此,我继续进行一番资料查询,后来大致定位了是由于文件路径过长导致的,是由于windows系统用户态的默认路径长度不能超过256个字节导致的。但是官方说256个字节是最长,但为何能创建超过256的呢,所以既然能创建,那就一定能删除,但是需要一些方法,经过一番学习,找到了好几种方法,下面介绍其中一种最为实用的方法,另外几个比如使用压缩软件压缩后删除(百度知道的结果)适合手动但不适合编程解决。这个方法在下一节中继续讲述。

3.文件系统关于长路径文件的相关定义

为解决windows下的长文件删除的问题,最为权威的资料莫过于windows官方的描述,我阅读了微软关于文件名长度的这一块的定义及说明,找到解决方案,微软的原文如下:

关键意思如下:1、Windows api 提供的文件路径理论上最长是 32767 个字节,普通状态下给用户使用是不超过256个字符,说是为了使用户操作更加方便。这里不得不吐槽一下了,确实操作方便了,但是方便的同时也可能带来不便,明明定义了32767这么长的字节,只给用256,未免太抠搜了一点

2、用户如果想要打破这个长度限制,可以通过一个特殊方式告诉windows系统自己想要使用超长文件,这个特殊的方式就是在绝对路径前加上** "\?" **字符串

3、这篇文档后面还有描述在windows10以后如何通过注册表的方式接触文件名长度限制,这里就没有截图了,因为不通用,win7怎么办呢?有兴趣的同学可以查看其原文链接阅读

好了,看到这,解决方法呼之欲出,其实简单得不能太简单,直接在绝对路径前加上一个"\?"即可:

# 获取目标路径的绝对路径,并在路径前加上\\?\,
# 以解除windows的文件长度限制
path = '\\\\?\\' + os.path.abspath(path)

4.改造 python 程序,删除长路径文件

根据上一节,对python程序进一步进行改造,加入windows长文件名限制解除,最后的完美删除工具就成型了:

import os
import shutil

path = "C:\\A\\"
keyword = "A1"

# 获取目标路径的绝对路径,并在路径前加上\\?\,
# 以解除windows的文件长度限制
path = '\\\\?\\' + os.path.abspath(path)

for root, dirs, files in os.walk(path):
    for dir in dirs:
        if keyword in dir:
            rmpath = os.path.join(root, dir)
            print("删除文件夹: %s" % rmpath)
            shutil.rmtree(rmpath)
    for file in files:
        if keyword in file:
            rmpath = os.path.join(root, file)
            print("删除文件: %s" % rmpath)
            os.remove(rmpath)

虽然代码很短,只添加了一行,但是这一行,却完成了一个超级核心的任务,真可谓是灵魂一行啊,最后该工具中如在生产环境中发挥了其出色的作用,使服务器继续运转如飞了。

5.总结思考

啰嗦的话就不多说了,说几点思考 

1、遇到问题将问题进行分解,拆分成一个个小问题逐步击破 

2、要善于阅读官方技术文档,有时候解决一个问题的核心可能很简单,代码可能也就一行两行,但是就是藏在某个角落,不仔细去阅读还真不一定找得出来 

3、python是个好东西,要有将问题转化成使用python去解决的习惯,习惯成自然,python可能在工作中就发挥大作用了呢。

到此这篇关于Python实现删除windows下的长路径文件的文章就介绍到这了,更多相关Python删除长路径文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python实现删除windows下的长路径文件

本文链接: https://www.lsjlt.com/news/119543.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现删除windows下的长路径文件
    目录1.文章背景2.使用 python 删除文件3.文件系统关于长路径文件的相关定义4.改造 python 程序,删除长路径文件5.总结思考1.文章背景 近期,笔者所在公司的某业务系...
    99+
    2024-04-02
  • 手把手使用 Python 删除 Windows 下的长路径文件
    0x01 文章背景近期,笔者所在公司的某业务系统的存储临近极限,服务器马上就要跑不动了,由于该业务系统A包含多个子系统A1、A2、A3 ... An,这些子系统的中间存储文件由于设计原因,都存储在同一个父级目录之内,唯一不同的是,...
    99+
    2023-05-14
    Python Windows root
  • php怎么删除路径下的所有文件夹和文件
    这篇文章主要介绍了php怎么删除路径下的所有文件夹和文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php怎么删除路径下的所有文件夹和文件文章都会有所收获,下面我们一起来看看吧。php遍历一个文件夹内的所有文...
    99+
    2023-07-05
  • php删除路径下的所有文件夹和文件的代码
    目录用到的函数函数申明函数调用php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用。 也适合在...
    99+
    2023-03-11
    php删除路径下的所有文件夹和文件的代码 php清空目录代码
  • 使用python怎么删除任意一个路径下的文件夹
    在python中使用shutil模块删除指定路径下的文件夹,具体方法如下:import osimport shutil #导入shutil模块delList = []delDir = "/home/test"delList = os.lis...
    99+
    2024-04-02
  • php怎么删除中文路径的文件
    PHP是一种非常强大的开源服务器端脚本语言,它被广泛使用于Web开发中。在PHP中,文件的操作非常重要,因为几乎所有的网站都需要用到文件操作。但是,在处理文件路径时,如果路径中含有中文,就会遇到一些问题。这篇文章将会介绍如何用PHP删除中文...
    99+
    2023-05-14
    php
  • php如何删除中文路径的文件
    本篇内容介绍了“php如何删除中文路径的文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,我们需要了解PHP中的一些基本知识。PHP中...
    99+
    2023-07-05
  • windows系统下文件名太长无法删除该怎么办?
    首先,此问题不对,所以,本文不保证一定能够解决Windows下文件名太长无法删除的问题。本经验只是根据个人经验总结,并不是指问题的标准解决方案。在windows下,有时候会出现“由 1、DEL /F /A /...
    99+
    2023-06-11
    windows 文件名 系统 太长
  • windows下rising文件夹如何删除
    本篇内容主要讲解“windows下rising文件夹如何删除”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows下rising文件夹如何删除”吧!rising文件夹删除办法方法一: 重启...
    99+
    2023-07-04
  • 让Python删除window下文件
    今天接到电话,有楼下客户反映,数据有问题,我连接到服务器上,发现broke的一个盘符空间满了,导致,应用在报错,停下服务,删除了庞大的日志文件,服务开启,一切正常了。    早就想写个脚本放在服务器上,今天正好有空,于是扒拉了一下,写了个P...
    99+
    2023-01-31
    文件 Python window
  • python Windows环境下文件路
    在python程序里面我们经常需要对文件进行操作,Windows下的文件目录路径使用反斜杠“\”来分隔。但是,和大多数语言一样,Python代码里面,反斜杠“\”是转义符,例如“\n”表示回车、“\t”表示制表符等等。这样,如果继...
    99+
    2023-01-31
    环境 文件 python
  • Windows下的.svn文件的批量删除技巧
    在使用SVN工具的时候会生成一些以“svn”作为后缀的文件,而且每个文件夹下都有,数量很多的。 如果想删除Windows下的.svn文件夹,通过手动删除的渠道是最麻烦的,因为每个文件夹下面都存在这...
    99+
    2023-05-31
    批量删除 windows svn文件 svn 技巧 . 文件
  • 解决Windows下删除文件提示无法删除问题
      我们在平时的电脑操作过程中,有时会碰到想要删除某个文件时,系统却提示无法删除(如图1),在切换到DOS状态下或者是在安全模式中虽然可以删除,但是这样操作起来却有点麻烦。   图1 无法删除   我们不妨想一想,用一...
    99+
    2023-06-03
    windows 删除文件 问题 文件
  • Windows下如何使用PHP访问文件路径?
    当我们在Windows下使用PHP时,经常需要访问文件路径,这是一个非常常见的需求。在本文中,我们将介绍如何使用PHP访问文件路径。 首先,我们需要知道Windows下文件路径的格式。Windows下的文件路径格式是以盘符开头,例如C:Wi...
    99+
    2023-07-01
    path windows shell
  • ASP 文件 path 存储:如何在 ASP 中删除存储的文件路径?
    在 ASP 中,我们经常需要处理文件的操作,比如读取、上传、删除等等。其中,文件的路径信息是非常重要的一部分,因为它决定了我们对文件进行操作的具体位置。ASP 提供了一些方法来处理文件路径信息,其中包括存储和删除文件路径。本文将介绍如何在...
    99+
    2023-07-07
    文件 path 存储
  • python获取工程路径下的文件方法
    import time, os, random import subprocess import re PATH = lambda p: os.path.abspath(os.path.join(os.path.dirname(__fil...
    99+
    2023-01-31
    路径 文件 方法
  • Linux下怎么删除长时间不使用的旧文件
    这篇文章主要为大家展示了“Linux下怎么删除长时间不使用的旧文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下怎么删除长时间不使用的旧文件”这篇文章吧。tmpwatch 是什么tm...
    99+
    2023-06-15
  • windows中cmd下添加、删除和修改静态路由实现
    目录1、添加一条路由表2、删除一条路由表3、修改一条现有路由记录4、查看路由表5、查看广播信息1、添加一条路由表 route add 192.168.20.0 mask 255.25...
    99+
    2024-04-02
  • Java怎么实现读取resources目录下的文件路径
    本篇内容主要讲解“Java怎么实现读取resources目录下的文件路径”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现读取resources目录下的文件路径”吧!打印文件的方法如...
    99+
    2023-06-29
  • Windows下.svn文件夹的最简易删除方法
    如果想删除Windows下的.svn文件夹,通过手动删除的渠道是最麻烦的,因为每个文件夹下面都存在这样的文件。下面是一个好办法:建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg)...
    99+
    2023-05-25
    svn 文件夹 删除 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作