目錄
0x01 文章背景
0x02 使用python 刪除檔案
0x03 windows 文件系统关于长路径文件的相关定义
0x04 改造 python 程序,删除长路径文件
0x04 总结思考
0x05 参考资料
首頁 後端開發 Python教學 手把手使用 Python 刪除 Windows 下的長路徑文件

手把手使用 Python 刪除 Windows 下的長路徑文件

Apr 12, 2023 pm 01:31 PM
python windows root

0x01 文章背景

近期,筆者所在公司的某業務系統的儲存臨近極限,伺服器馬上就要跑不動了,由於該業務系統A包含多個子系統A1、A2、A3 . .. An,這些子系統的中間儲存檔案由於設計原因,都儲存在同一個父級目錄之內,唯一不同的是,不同子系統產生的檔案和資料夾的名字都以該子系統名稱開始。如A1子系統所產生的檔案命名方式均為A1xxxxxx, A2子系統所產生的檔名均為A2xxxxx。現在要刪除其中一些子系統的歷史文件,以釋放伺服器空間,幾十T的數據,存放在一起,手動刪除肯定不顯示,只能藉助程式自動化實現了,使用什麼呢?自然想到了python。其實單純刪文件這一需求我認為不值得長篇闊論,但是其中遇到了一些特殊有趣的問題和一些有意思的解決方案,所以想與諸位分享一下,比如windows系統下的超長文件刪除, 如從閱讀官方英文文件尋找解決方案等等,下面進入正題。

0x02 使用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())遍歷指定目錄,逐一判斷目錄下所有子目錄和檔案是否符合關鍵字條件,滿足就刪除。

運行效果為:

手把手使用 Python 刪除 Windows 下的長路徑文件

看似需求到此基本上就很好的解決了,但是實際測試中發現有的很深的目錄卻沒有刪除,刪除目錄時報了一個錯,錯誤描述如下:

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

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

0x03 windows 文件系统关于长路径文件的相关定义

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

手把手使用 Python 刪除 Windows 下的長路徑文件

关键意思如下:

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

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

3.这篇文档后面还有描述在windows10以后如何通过注册表的方式接触文件名长度限制,这里就没有截图了,因为不通用,win7怎么办呢?有兴趣的同学可以查看其原文链接阅读:https://docs.microsoft.com/en-US/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd

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

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

0x04 改造 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)
登入後複製

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

0x04 总结思考

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

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

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

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

0x05 参考资料

1.https://docs.microsoft.com/en-US/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd  

2.https://stackoverflow.com/questions/6996603/how-to-delete-a-file-or-folder-in

以上是手把手使用 Python 刪除 Windows 下的長路徑文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

vscode怎麼在終端運行程序 vscode怎麼在終端運行程序 Apr 15, 2025 pm 06:42 PM

在 VS Code 中,可以通過以下步驟在終端運行程序:準備代碼和打開集成終端確保代碼目錄與終端工作目錄一致根據編程語言選擇運行命令(如 Python 的 python your_file_name.py)檢查是否成功運行並解決錯誤利用調試器提升調試效率

Python:自動化,腳本和任務管理 Python:自動化,腳本和任務管理 Apr 16, 2025 am 12:14 AM

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

vscode 擴展是否是惡意的 vscode 擴展是否是惡意的 Apr 15, 2025 pm 07:57 PM

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。

vscode是什麼 vscode是乾什麼用的 vscode是什麼 vscode是乾什麼用的 Apr 15, 2025 pm 06:45 PM

VS Code 全稱 Visual Studio Code,是一個由微軟開發的免費開源跨平台代碼編輯器和開發環境。它支持廣泛的編程語言,提供語法高亮、代碼自動補全、代碼片段和智能提示等功能以提高開發效率。通過豐富的擴展生態系統,用戶可以針對特定需求和語言添加擴展程序,例如調試器、代碼格式化工具和 Git 集成。 VS Code 還包含直觀的調試器,有助於快速查找和解決代碼中的 bug。

vscode 可以在 mac 上嗎 vscode 可以在 mac 上嗎 Apr 15, 2025 pm 07:45 PM

VS Code 在 macOS 上表現良好,可提升開發效率。安裝和配置步驟包括:安裝 VS Code 並進行配置。安裝特定語言的擴展(如 JavaScript 的 ESLint)。謹慎安裝擴展,避免過多導致啟動變慢。學習基本功能,如 Git 集成、終端和調試器。設置合適的主題和代碼字體。注意潛在問題:擴展兼容性、文件權限等。

vscode 無法運行 python怎麼回事 vscode 無法運行 python怎麼回事 Apr 15, 2025 pm 06:00 PM

最常見的“無法運行 Python”問題源於 Python 解釋器路徑的錯誤配置,解決方法包括:確認 Python 安裝、配置 VS Code、使用虛擬環境。除此之外,還有斷點調試、變量監視、日誌輸出、代碼格式化等高效的調試技巧和最佳實踐,如使用虛擬環境隔離依賴,使用斷點追踪代碼執行,使用監視表達式實時跟踪變量變化等,這些能大幅提高開發效率。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

See all articles