Python判斷一個目錄下哪些是文件哪些是文件夾的方法
在Python中識別目錄下的文件和文件夾非常簡單,以下是完整解決方案:
import os
import sys
import argparse
from datetime import datetime
def list_directory_contents(directory_path, recursive=False, output_file=None):
"""
高級目錄掃描工具
- 支持遞歸掃描子目錄
- 顯示詳細文件屬性
- 可選輸出到文件
- 自動處理路徑異常
:param directory_path: 要掃描的目錄路徑
:param recursive: 是否遞歸掃描子目錄
:param output_file: 輸出結(jié)果的文件路徑
"""
# 驗證并清理路徑
directory_path = os.path.abspath(directory_path)
# 自動創(chuàng)建不存在的目錄
if not os.path.exists(directory_path):
try:
os.makedirs(directory_path)
print(f"? 已創(chuàng)建目錄: {directory_path}")
except OSError as e:
print(f"? 無法創(chuàng)建目錄: {e}")
return
# 確保是目錄
if not os.path.isdir(directory_path):
print(f"? 錯誤: '{directory_path}' 不是一個目錄")
return
results = []
def scan_directory(path, level=0):
"""遞歸掃描目錄"""
try:
with os.scandir(path) as entries:
for entry in entries:
try:
# 獲取文件信息
stat = entry.stat()
size = stat.st_size
modified_time = stat.st_mtime
created_time = stat.st_ctime
# 格式化時間
modified_str = datetime.fromtimestamp(modified_time).strftime('%Y-%m-%d %H:%M:%S')
created_str = datetime.fromtimestamp(created_time).strftime('%Y-%m-%d %H:%M:%S')
# 判斷文件類型
if entry.is_file():
entry_type = '文件'
elif entry.is_dir():
entry_type = '文件夾'
elif entry.is_symlink():
entry_type = '符號鏈接'
else:
entry_type = '其他類型'
# 收集信息
info = {
'name': entry.name,
'type': entry_type,
'size': size,
'modified': modified_str,
'created': created_str,
'path': os.path.abspath(entry.path),
'level': level
}
results.append(info)
# 遞歸掃描子目錄
if recursive and entry.is_dir():
scan_directory(entry.path, level + 1)
except OSError as e:
print(f"?? 無法訪問 '{entry.path}': {e}", file=sys.stderr)
except PermissionError:
print(f"?? 權(quán)限不足,無法掃描 '{path}'", file=sys.stderr)
except OSError as e:
print(f"?? 掃描 '{path}' 時發(fā)生錯誤: {e}", file=sys.stderr)
# 開始掃描
print(f"?? 掃描目錄: {directory_path}")
scan_directory(directory_path)
# 輸出結(jié)果
if results:
# 打印結(jié)果
print("\n?? 目錄結(jié)構(gòu):")
for info in results:
# 創(chuàng)建縮進
indent = ' ' * (info['level'] * 4)
# 文件大小格式化
size_str = format_size(info['size'])
# 打印信息
print(f"{indent}[{info['type']}] {info['name']} - {size_str} - 修改時間: {info['modified']}")
# 統(tǒng)計信息
file_count = sum(1 for r in results if r['type'] == '文件')
dir_count = sum(1 for r in results if r['type'] == '文件夾')
symlink_count = sum(1 for r in results if r['type'] == '符號鏈接')
print(f"\n?? 統(tǒng)計信息:")
print(f" 文件數(shù)量: {file_count}")
print(f" 文件夾數(shù)量: {dir_count}")
print(f" 符號鏈接數(shù)量: {symlink_count}")
print(f" 總條目數(shù): {len(results)}")
# 保存到文件
if output_file:
try:
with open(output_file, 'w', encoding='utf-8') as f:
f.write("?? 目錄結(jié)構(gòu)報告\n")
f.write("="*50 + "\n\n")
f.write(f"掃描路徑: {directory_path}\n")
f.write(f"掃描時間: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"總條目數(shù): {len(results)}\n\n")
# 寫入詳細信息
for info in results:
indent = ' ' * (info['level'] * 4)
size_str = format_size(info['size'])
f.write(f"{indent}[{info['type']}] {info['name']} - {size_str} - 修改時間: {info['modified']}\n")
# 寫入統(tǒng)計信息
f.write("\n?? 統(tǒng)計信息:\n")
f.write(f"文件數(shù)量: {file_count}\n")
f.write(f"文件夾數(shù)量: {dir_count}\n")
f.write(f"符號鏈接數(shù)量: {symlink_count}\n")
print(f"? 結(jié)果已保存到: {output_file}")
except OSError as e:
print(f"? 無法保存結(jié)果到文件: {e}")
else:
print("?? 目錄為空")
def format_size(size_bytes):
"""
將字節(jié)大小轉(zhuǎn)換為更易讀的格式
:param size_bytes: 文件大小(字節(jié))
:return: 格式化后的字符串
"""
if size_bytes == 0:
return "0 B"
units = ["B", "KB", "MB", "GB", "TB"]
num = abs(size_bytes)
unit = units[0]
for u in units[1:]:
if num < 1024.0:
break
num /= 1024.0
unit = u
return f"{num:.2f} {unit}"
def main():
"""主函數(shù),處理命令行參數(shù)"""
# 創(chuàng)建命令行參數(shù)解析器
parser = argparse.ArgumentParser(description='?? 高級目錄掃描工具')
parser.add_argument('directory', nargs='?', default=os.getcwd(),
help='要掃描的目錄路徑(默認當前目錄)')
parser.add_argument('-r', '--recursive', action='store_true',
help='遞歸掃描子目錄')
parser.add_argument('-o', '--output',
help='輸出結(jié)果到指定文件')
# 解析參數(shù)
args = parser.parse_args()
# 運行目錄掃描
list_directory_contents(args.directory, args.recursive, args.output)
if __name__ == "__main__":
main()
功能特點
智能路徑處理:
- 自動創(chuàng)建不存在的目錄
- 規(guī)范路徑格式
- 處理跨平臺路徑問題
詳細文件屬性:
- 文件類型識別(文件/文件夾/符號鏈接)
- 文件大?。ㄗ詣愚D(zhuǎn)換單位)
- 創(chuàng)建和修改時間
- 完整路徑信息
高級功能:
- 遞歸掃描子目錄
- 統(tǒng)計信息匯總
- 結(jié)果輸出到文件
- 錯誤處理和權(quán)限檢查
用戶友好輸出:
- 彩色符號標識
- 樹形結(jié)構(gòu)展示
- 格式化文件大小
- 清晰的統(tǒng)計信息
使用方法
# 掃描當前目錄 python scanner.py # 掃描指定目錄 python scanner.py /path/to/directory # 遞歸掃描子目錄 python scanner.py /path/to/directory -r # 遞歸掃描并保存結(jié)果到文件 python scanner.py /path/to/directory -r -o report.txt
輸出示例
?? 掃描目錄: /run_python/example_dir ?? 目錄結(jié)構(gòu): [文件夾] images [文件夾] documents [文件] report.docx - 128.43 KB - 修改時間: 2023-10-05 14:30:00 [文件夾] archive [文件] presentation.pptx - 2.10 MB - 修改時間: 2023-10-04 10:15:00 ?? 統(tǒng)計信息: 文件數(shù)量: 2 文件夾數(shù)量: 3 符號鏈接數(shù)量: 0 總條目數(shù): 5
這個工具提供了專業(yè)的目錄掃描解決方案,能夠滿足各種文件和文件夾識別需求,同時具備強大的錯誤處理和用戶友好的輸出界面。
到此這篇關(guān)于Python判斷一個目錄下哪些是文件哪些是文件夾的方法的文章就介紹到這了,更多相關(guān)Python判斷文件和文件夾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
keras:model.compile損失函數(shù)的用法
這篇文章主要介紹了keras:model.compile損失函數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Ubuntu20.04環(huán)境安裝tensorflow2的方法步驟
這篇文章主要介紹了Ubuntu20.04環(huán)境安裝tensorflow2的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
使用Python和wxPython實現(xiàn)下載視頻封面
這篇文章主要為大家詳細介紹了如何使用Python和wxPython實現(xiàn)下載視頻封面,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-04-04
Django import export實現(xiàn)數(shù)據(jù)庫導入導出方式
這篇文章主要介紹了Django import export實現(xiàn)數(shù)據(jù)庫導入導出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
django中的數(shù)據(jù)庫遷移的實現(xiàn)
這篇文章主要介紹了django中的數(shù)據(jù)庫遷移的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
K-means聚類算法介紹與利用python實現(xiàn)的代碼示例
K-means聚類算法(事先數(shù)據(jù)并沒有類別之分!所有的數(shù)據(jù)都是一樣的)是我們大家應(yīng)該都聽過的一種算法,下面這篇文章主要給大家介紹了關(guān)于K-means聚類算法的基礎(chǔ)知識與利用python如何實現(xiàn)該算法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11

