Python脚本实现扫描指定目录下.py文件并提取import语句

 更新时间:2026年03月12日 08:31:54   作者:weixin_30777913  
这篇文章主要为大家详细介绍了如何使用Python脚本实现扫描指定目录下.py文件并提取import语句,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

Python脚本用于扫描指定目录下所有的.py文件,提取其中所有的import语句中的模块名(包括相对导入),去重后按时间戳命名输出到文本文件。

完整代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
扫描目录下所有 Python 文件,提取所有 import 语句中的模块名,
去重后保存到以时间戳命名的文本文件中。
"""

import os
import sys
import ast
import argparse
from datetime import datetime


def extract_imports_from_file(filepath):
    """
    解析单个 Python 文件,返回该文件中导入的所有模块名(集合)。
    支持:
        - import module
        - import module as alias
        - from module import name
        - from module import name as alias
        - 相对导入(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:
                    # 绝对导入或相对导入但指定了模块(如 from .sub import x)
                    if node.level > 0:
                        # 相对导入,模块名前加对应数量的点
                        module = '.' * node.level + node.module
                    else:
                        module = node.module
                else:
                    # 纯相对导入(如 from . import x, from .. import y)
                    module = '.' * node.level
                modules.add(module)
    except Exception as e:
        print(f"警告:解析文件 {filepath} 时出错:{e}", file=sys.stderr)

    return modules


def main():
    parser = argparse.ArgumentParser(
        description='扫描目录下的 Python 文件,提取所有 import 模块名并去重输出。'
    )
    parser.add_argument(
        'directory',
        nargs='?',
        default='.',
        help='要扫描的目录(默认:当前目录)'
    )
    args = parser.parse_args()

    target_dir = args.directory
    if not os.path.isdir(target_dir):
        print(f"错误:'{target_dir}' 不是一个有效的目录。", 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 语句。")
        return

    # 排序后输出
    sorted_modules = sorted(all_modules)

    # 生成时间戳文件名
    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)} 个唯一模块。")
    print(f"结果已写入:{output_filename}")


if __name__ == '__main__':
    main()

使用方法

将上述代码保存为 .py 文件(例如 scan_imports.py)。

在终端中运行:

python scan_imports.py [要扫描的目录]

如果不指定目录,则默认扫描当前目录。

脚本会在当前目录下生成一个类似 imports_20250311_143022.txt 的文件,每行列出一个模块名(已去重)。

功能说明

  • 递归扫描指定目录下所有 .py 文件。
  • 使用 Python 的 ast 模块解析代码,准确提取各种形式的 import 语句(包括别名和相对导入)。
  • 对于 from ... import ...,记录 from 后面的模块名(相对导入会保留前导点号)。
  • 对于 import ...,记录 import 后面的模块名(包括点号分隔的子模块)。
  • 去重后按字母顺序排序,输出到以时间戳命名的文本文件。

到此这篇关于Python脚本实现扫描指定目录下.py文件并提取import语句的文章就介绍到这了,更多相关Python扫描py文件并提取import语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 剖析Python的Tornado框架中session支持的实现代码

    剖析Python的Tornado框架中session支持的实现代码

    这篇文章主要介绍了剖析Python的Tornado框架中session支持的实现代码,这样就可以使用Django等框架中大家所熟悉的session了,需要的朋友可以参考下
    2015-08-08
  • python找出因数与质因数的方法

    python找出因数与质因数的方法

    这篇文章主要介绍了python找出因数与质因数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • pyqt5制作登录窗口的详细过程

    pyqt5制作登录窗口的详细过程

    这篇文章主要介绍了pyqt5制作登录窗口的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Python Pandas 删除列操作

    Python Pandas 删除列操作

    这篇文章主要介绍了Python Pandas 删除列操作,主要操作使用del和drop方法删除DataFrame中的列,使用drop方法一次删除多列,需要的朋友可以参考一下
    2022-03-03
  • python修改字典内key对应值的方法

    python修改字典内key对应值的方法

    这篇文章主要介绍了python修改字典内key对应值的方法,涉及Python中字典赋值的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 对numpy中shape的深入理解

    对numpy中shape的深入理解

    今天小编就为大家分享一篇对numpy中shape的深入理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Django基于ORM操作数据库的方法详解

    Django基于ORM操作数据库的方法详解

    这篇文章主要介绍了Django基于ORM操作数据库的方法,结合实例形式总结分析了Django使用ORM操作数据库的相关配置、增删改查等相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • Python笔记(叁)继续学习

    Python笔记(叁)继续学习

    最近时间挤来挤去,看英文的文档,顺便熟悉英语,需要反复好几遍,才能做点笔记。读的是《Beginning.Python.From.Novice.to.Professional》,大家可以下载看一下
    2012-10-10
  • python中的编码知识整理汇总

    python中的编码知识整理汇总

    这篇文章主要介绍了python中的编码知识整理汇总的相关资料,需要的朋友可以参考下
    2016-01-01
  • 在Python中居然可以定义两个同名通参数的函数

    在Python中居然可以定义两个同名通参数的函数

    今天小编就为大家分享一篇在Python中居然可以定义两个同名通参数的函数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论