Python腳本實(shí)現(xiàn)掃描指定目錄下.py文件并提取import語(yǔ)句
Python腳本用于掃描指定目錄下所有的.py文件,提取其中所有的import語(yǔ)句中的模塊名(包括相對(duì)導(dǎo)入),去重后按時(shí)間戳命名輸出到文本文件。
完整代碼
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
掃描目錄下所有 Python 文件,提取所有 import 語(yǔ)句中的模塊名,
去重后保存到以時(shí)間戳命名的文本文件中。
"""
import os
import sys
import ast
import argparse
from datetime import datetime
def extract_imports_from_file(filepath):
"""
解析單個(gè) Python 文件,返回該文件中導(dǎo)入的所有模塊名(集合)。
支持:
- import module
- import module as alias
- from module import name
- from module import name as alias
- 相對(duì)導(dǎo)入(from . import x, from ..sub import y 等)
"""
modules = set()
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
tree = ast.parse(content, filename=filepath)
for node in ast.walk(tree):
if isinstance(node, ast.Import):
# import module, import module as alias
for alias in node.names:
modules.add(alias.name) # 完整模塊名
elif isinstance(node, ast.ImportFrom):
# from module import ...
if node.module:
# 絕對(duì)導(dǎo)入或相對(duì)導(dǎo)入但指定了模塊(如 from .sub import x)
if node.level > 0:
# 相對(duì)導(dǎo)入,模塊名前加對(duì)應(yīng)數(shù)量的點(diǎn)
module = '.' * node.level + node.module
else:
module = node.module
else:
# 純相對(duì)導(dǎo)入(如 from . import x, from .. import y)
module = '.' * node.level
modules.add(module)
except Exception as e:
print(f"警告:解析文件 {filepath} 時(shí)出錯(cuò):{e}", file=sys.stderr)
return modules
def main():
parser = argparse.ArgumentParser(
description='掃描目錄下的 Python 文件,提取所有 import 模塊名并去重輸出。'
)
parser.add_argument(
'directory',
nargs='?',
default='.',
help='要掃描的目錄(默認(rèn):當(dāng)前目錄)'
)
args = parser.parse_args()
target_dir = args.directory
if not os.path.isdir(target_dir):
print(f"錯(cuò)誤:'{target_dir}' 不是一個(gè)有效的目錄。", file=sys.stderr)
sys.exit(1)
all_modules = set()
# 遞歸遍歷目錄
for root, dirs, files in os.walk(target_dir):
for file in files:
if file.endswith('.py'):
filepath = os.path.join(root, file)
modules = extract_imports_from_file(filepath)
all_modules.update(modules)
if not all_modules:
print("未找到任何 import 語(yǔ)句。")
return
# 排序后輸出
sorted_modules = sorted(all_modules)
# 生成時(shí)間戳文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_filename = f"imports_{timestamp}.txt"
with open(output_filename, 'w', encoding='utf-8') as f:
for module in sorted_modules:
f.write(module + '\n')
print(f"共找到 {len(sorted_modules)} 個(gè)唯一模塊。")
print(f"結(jié)果已寫(xiě)入:{output_filename}")
if __name__ == '__main__':
main()
使用方法
將上述代碼保存為 .py 文件(例如 scan_imports.py)。
在終端中運(yùn)行:
python scan_imports.py [要掃描的目錄](méi)
如果不指定目錄,則默認(rèn)掃描當(dāng)前目錄。
腳本會(huì)在當(dāng)前目錄下生成一個(gè)類(lèi)似 imports_20250311_143022.txt 的文件,每行列出一個(gè)模塊名(已去重)。
功能說(shuō)明
- 遞歸掃描指定目錄下所有
.py文件。 - 使用 Python 的
ast模塊解析代碼,準(zhǔn)確提取各種形式的import語(yǔ)句(包括別名和相對(duì)導(dǎo)入)。 - 對(duì)于
from ... import ...,記錄from后面的模塊名(相對(duì)導(dǎo)入會(huì)保留前導(dǎo)點(diǎn)號(hào))。 - 對(duì)于
import ...,記錄import后面的模塊名(包括點(diǎn)號(hào)分隔的子模塊)。 - 去重后按字母順序排序,輸出到以時(shí)間戳命名的文本文件。
到此這篇關(guān)于Python腳本實(shí)現(xiàn)掃描指定目錄下.py文件并提取import語(yǔ)句的文章就介紹到這了,更多相關(guān)Python掃描py文件并提取import語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python OpenCV實(shí)戰(zhàn)之與機(jī)器學(xué)習(xí)的碰撞
機(jī)器學(xué)習(xí)是人工智能的子集,為計(jì)算機(jī)以及其它具有計(jì)算能力的系統(tǒng)提供自動(dòng)預(yù)測(cè)或決策的能力。本文主要介紹了OpenCV 提供的常見(jiàn)機(jī)器學(xué)習(xí)算法和技術(shù),用于解決計(jì)算機(jī)視覺(jué)項(xiàng)目中的實(shí)際問(wèn)題,需要的朋友可以參考一下2021-12-12
對(duì)Pandas MultiIndex(多重索引)詳解
今天小編就為大家分享一篇對(duì)Pandas MultiIndex(多重索引)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
解決Jupyter無(wú)法導(dǎo)入已安裝的 module問(wèn)題
這篇文章主要介紹了解決Jupyter無(wú)法導(dǎo)入已安裝的 module問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python?range函數(shù)生成一系列連續(xù)整數(shù)的內(nèi)部機(jī)制解析
這篇文章主要為大家介紹了Python?range函數(shù)生成一系列連續(xù)整數(shù)的內(nèi)部機(jī)制解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Python基礎(chǔ)學(xué)習(xí)之函數(shù)和代碼復(fù)用詳解
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率,下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)學(xué)習(xí)之函數(shù)和代碼復(fù)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
python中dict獲取關(guān)鍵字與值的實(shí)現(xiàn)
這篇文章主要介紹了python中dict獲取關(guān)鍵字與值的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

