高效导入多目录Python文件字典至Pandas DataFrame

高效导入多目录Python文件字典至Pandas DataFrame

本文详细介绍了如何从多层嵌套目录中的python文件里提取包含特定格式的字典数据,并利用`os.walk`遍历文件系统、`ast.literal_eval`安全解析字典字符串,最终将其高效整合并构建成一个统一的pandas dataframe。教程涵盖了文件路径获取、内容读取、字典解析及dataframe构建与合并的完整流程。

在数据处理和自动化任务中,我们经常会遇到需要从散布在文件系统各处的配置文件或数据文件中提取结构化信息的情况。特别是在复杂的项目结构中,如果数据以Python字典的形式存储在多个.py文件中,并需要将其汇总到一个统一的Pandas DataFrame中进行分析,这就需要一套系统性的处理方法。本教程将指导您完成这一过程,包括文件系统遍历、文件内容读取、字典字符串的安全解析以及最终的DataFrame构建与合并。

1. 遍历文件系统以定位目标文件

首先,我们需要一种机制来扫描指定根目录下的所有子目录,找到包含目标字典的Python文件。Python的os模块提供了强大的文件系统交互功能,其中os.walk()函数是实现这一目标的核心工具。它会递归地遍历目录树,为每个目录生成一个三元组:(root, dirs, files),分别代表当前目录路径、子目录列表和文件列表。

假设我们的目标文件是form.py,并且它们可能位于任意深度的子目录中。我们可以使用os.walk()结合文件后缀名过滤来找到这些文件。

import osimport pandas as pdimport ast # 用于安全地评估字符串中的Python字面量# 定义起始搜索路径,可以替换为您的实际根目录# 例如:base_path = os.environ["JUPYTER_ROOT"] + "/charts/"base_path = "./charts_data/" # 示例路径,请根据实际情况修改target_files = []for root, dirs, files in os.walk(base_path):    for file in files:        if file.endswith("form.py"):            file_path = os.path.join(root, file)            target_files.append(file_path)print(f"找到 {len(target_files)} 个目标文件。")# print(target_files) # 打印找到的文件路径列表

2. 读取文件内容并提取字典字符串

找到所有目标文件后,下一步是打开每个文件,读取其内容,并从中识别出我们需要的字典字符串。在许多场景中,字典可能以变量赋值的形式存在,例如 def_options = {‘key1’: ‘value1’, ‘key2’: ‘value2’}。我们需要解析这些行,提取出字典的纯字符串表示。

立即学习“Python免费学习笔记(深入)”;

笔目鱼英文论文写作器 笔目鱼英文论文写作器

写高质量英文论文,就用笔目鱼

笔目鱼英文论文写作器 87 查看详情 笔目鱼英文论文写作器

为了确保提取的准确性,我们可以结合字符串查找和分割操作。例如,如果已知字典包含特定的键(如”name”和”age”),我们可以利用这些键来定位包含字典的行。

extracted_dictionaries = []for file_path in target_files:    with open(file_path, "r", encoding="utf-8") as f:        for line in f:            stripped_line = line.strip()            # 假设字典行包含 'name' 和 'age' 键,并且以 'def_options =' 开头            # 您需要根据实际的字典定义格式调整此处的判断逻辑            if "name" in stripped_line and "age" in stripped_line and "def_options =" in stripped_line:                try:                    # 分割字符串,获取等号右侧的字典部分                    dictionary_str = stripped_line.split("=", 1)[1].strip()                    extracted_dictionaries.append(dictionary_str)                    break # 假设每个文件只包含一个目标字典,找到后即可跳出当前文件循环                except IndexError:                    print(f"警告: 无法从文件 {file_path} 的行中正确分割字典字符串: {stripped_line}")                except Exception as e:                    print(f"警告: 处理文件 {file_path} 的行时发生错误: {e} - 行内容: {stripped_line}")# print(f"提取到 {len(extracted_dictionaries)} 个字典字符串。")# for d_str in extracted_dictionaries:#     print(d_str)

3. 安全解析字典字符串为Python字典

直接使用Python的eval()函数来解析从文件中读取的字符串存在安全风险,因为它会执行任意代码。为了安全地将字典字符串转换为实际的Python字典对象,我们应该使用ast.literal_eval()。这个函数只能评估包含Python字面量(字符串、数字、元组、列表、字典、布尔值和None)的字符串,而不会执行任意代码。

parsed_dictionaries = []for dict_str in extracted_dictionaries:    try:        # 使用 ast.literal_eval 安全地解析字典字符串        dictionary_obj = ast.literal_eval(dict_str)        if isinstance(dictionary_obj, dict): # 确保解析结果确实是字典            parsed_dictionaries.append(dictionary_obj)        else:            print(f"警告: 解析结果不是字典类型: {dict_str}")    except (ValueError, SyntaxError) as e:        print(f"错误: 无法解析字典字符串 '{dict_str}': {e}")print(f"成功解析 {len(parsed_dictionaries)} 个字典对象。")

4. 构建并合并Pandas DataFrame

有了所有解析好的字典对象列表,最后一步是将其转换为Pandas DataFrame。由于所有字典具有相同的键,我们可以直接将字典列表传递给pd.DataFrame构造函数,或者逐个字典转换为DataFrame行并进行合并。对于大量字典,通常建议先收集所有字典到一个列表,然后一次性构建DataFrame,这比反复连接DataFrame更高效。

# 确保所有字典具有相同的键,这是构建统一DataFrame的前提if not parsed_dictionaries:    print("没有可用的字典来构建DataFrame。")else:    # 方式一:直接从字典列表构建DataFrame(推荐)    final_dataframe = pd.DataFrame(parsed_dictionaries)    print("n最终构建的Pandas DataFrame (方式一):")    print(final_dataframe.head())    # 方式二:逐个字典构建DataFrame并合并(适用于特殊情况,效率可能略低)    # all_dfs = []    # for d in parsed_dictionaries:    #     # 将单个字典转换为DataFrame的一行    #     df_row = pd.DataFrame([d])    #     all_dfs.append(df_row)    #    # if all_dfs:    #     final_dataframe_concat = pd.concat(all_dfs, ignore_index=True)    #     print("n最终构建的Pandas DataFrame (方式二):")    #     print(final_dataframe_concat.head())    # else:    #     print("没有可用的字典来构建DataFrame。")

完整示例代码

import osimport pandas as pdimport astdef import_dictionaries_to_dataframe(base_path: str, filename_pattern: str = "form.py", dict_key_indicators: tuple = ("name", "age"), dict_var_name: str = "def_options =") -> pd.DataFrame:    """    从多层嵌套目录的Python文件中提取字典,并构建Pandas DataFrame。    Args:        base_path (str): 开始搜索的根目录路径。        filename_pattern (str): 目标Python文件的文件名模式,例如 "form.py"。        dict_key_indicators (tuple): 用于识别包含目标字典的行的键指示器,例如 ("name", "age")。        dict_var_name (str): 字典变量在文件中的赋值前缀,例如 "def_options ="。    Returns:        pd.DataFrame: 包含所有提取字典数据的Pandas DataFrame。                      如果未找到或解析任何字典,则返回空的DataFrame。    """    target_files = []    for root, dirs, files in os.walk(base_path):        for file in files:            if file.endswith(filename_pattern):                file_path = os.path.join(root, file)                target_files.append(file_path)    extracted_dictionaries_data = []    for file_path in target_files:        with open(file_path, "r", encoding="utf-8") as f:            for line in f:                stripped_line = line.strip()                # 检查行是否包含所有指示键和变量名                if all(key in stripped_line for key in dict_key_indicators) and dict_var_name in stripped_line:                    try:                        # 提取字典字符串                        dictionary_str = stripped_line.split(dict_var_name, 1)[1].strip()                        # 安全解析字典字符串                        dictionary_obj = ast.literal_eval(dictionary_str)                        if isinstance(dictionary_obj, dict):                            extracted_dictionaries_data.append(dictionary_obj)                            break # 假设每个文件只包含一个目标字典                        else:                            print(f"警告: 文件 {file_path} 中解析结果不是字典类型: {dictionary_str}")                    except (ValueError, SyntaxError) as e:                        print(f"错误: 无法解析文件 {file_path} 中的字典字符串 '{dictionary_str}': {e}")                    except IndexError:                        print(f"警告: 文件 {file_path} 的行 '{stripped_line}' 无法正确分割字典字符串。")                    except Exception as e:                        print(f"警告: 处理文件 {file_path} 的行时发生未知错误: {e} - 行内容: {stripped_line}")    if extracted_dictionaries_data:        return pd.DataFrame(extracted_dictionaries_data)    else:        print("未找到或成功解析任何字典数据。")        return pd.DataFrame()# 示例使用:# 假设您的项目结构如下:# ./charts_data/# ├── ahc_visits/# │   └── booking_breakdown_per_age_group/# │       └── form.py  (内容:def_options = {'name': 'Alice', 'age': 30, 'city': 'NY'})# └── other_charts/#     └── some_report/#         └── form.py  (内容:def_options = {'name': 'Bob', 'age': 25, 'city': 'LA'})# 创建一些模拟文件用于测试os.makedirs("./charts_data/ahc_visits/booking_breakdown_per_age_group", exist_ok=True)with open("./charts_data/ahc_visits/booking_breakdown_per_age_group/form.py", "w") as f:    f.write("def_options = {'name': 'Alice', 'age': 30, 'city': 'New York'}n")os.makedirs("./charts_data/other_charts/some_report", exist_ok=True)with open("./charts_data/other_charts/some_report/form.py", "w") as f:    f.write("def_options = {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'}n")os.makedirs("./charts_data/another_folder", exist_ok=True)with open("./charts_data/another_folder/form.py", "w") as f:    f.write("def_options = {'name': 'Charlie', 'age': 35, 'city': 'Chicago', 'occupation': 'Engineer'}n")# 调用函数base_dir = "./charts_data/"df = import_dictionaries_to_dataframe(base_dir, dict_key_indicators=("name", "age"), dict_var_name="def_options =")if not df.empty:    print("n最终生成的DataFrame:")    print(df)else:    print("DataFrame为空。")# 清理模拟文件import shutilif os.path.exists(base_dir):    shutil.rmtree(base_dir)

注意事项与总结

字典格式一致性: 本教程假设所有form.py文件中的字典都具有相同的键结构。如果键不一致,pd.DataFrame会自动填充NaN值。字典识别逻辑: 识别包含字典的行 (if “name” in stripped_line and “age” in stripped_line and “def_options =” in stripped_line:) 是关键。您需要根据实际文件中字典的定义方式来调整此处的条件判断和字符串分割逻辑。例如,如果字典没有前缀变量名,或者有其他独特的标识符,需要相应修改。错误处理: 在实际应用中,文件可能损坏、格式不符或不包含预期的字典。代码中包含了try-except块来捕获ast.literal_eval可能引发的ValueError或SyntaxError,以及其他潜在的异常,从而提高程序的健壮性。编码 读取文件时指定encoding=”utf-8″是一个好习惯,可以避免因编码问题导致的错误。性能优化: 对于极其庞大的文件系统和海量文件,可以考虑使用多线程或多进程来并行处理文件,以提高数据提取效率。数据存储替代方案: 如果form.py文件仅用于存储数据而非执行代码,考虑使用更适合数据存储的格式,如JSON或YAML,它们有更完善的解析库,且通常更明确地表示数据结构。

通过上述步骤,您可以有效地从分散在多层目录中的Python文件中提取结构化字典数据,并将其整合到一个易于分析和操作的Pandas DataFrame中。

以上就是高效导入多目录Python文件字典至Pandas DataFrame的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/588403.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 14:14:49
下一篇 2025年11月10日 14:16:08

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 10款好看且实用的文字动画特效,让你的页面更吸引人!

    图片和文字是网页不可缺少的组成部分,图片运用得当可以让网页变得生动,但普通的文字不行。那么就可以给文字添加一些样式,实现一下好看的文字效果,让页面变得更交互,更吸引人。下面创想鸟就来给大家分享10款文字动画特效,好看且实用,快来收藏吧! 1、网页玻璃文字动画特效 模板简介:使用css3制作网页渐变底…

    2025年12月24日 好文分享
    000
  • tp5如何引入css文件

    tp5引入css文件的方法:1、将css文件放在public目录下的static文件里即可;2、在页面引入中写上“”语句即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 其实很简单,只需要将css,js,image文件放在这个目录下即可 页…

    2025年12月24日
    000
  • 聊聊CSS 与 JS 是如何阻塞 DOM 解析和渲染的

    本篇文章给大家介绍一下css和js阻塞 dom 解析和渲染的原理。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 hello~各位亲爱的看官老爷们大家好。估计大家都听过,尽量将CSS放头部,JS放底部,这样可以提高页面的性能。然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其…

    2025年12月24日
    200
  • js如何修改css样式

    js修改css样式的方法:1、使用【obj.className】来修改样式表的类名;2、使用【obj.style.cssTest】来修改嵌入式的css;3、使用【obj.className】来修改样式表的类名;4、使用更改外联的css。 本教程操作环境:windows7系统、css3版,DELL G…

    2025年12月24日
    000
  • 如何使用纯CSS、JS实现图片轮播效果

    本篇文章给大家详细介绍一下使用纯css、js实现图片轮播效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 .carousel {width: 648px;height: 400px;margin: 0 auto;text-align: center;position: a…

    2025年12月24日
    000
  • css怎么设置文件编码

    在css中,可以使用“@charset”规则来设置编码,语法格式“@charset “字符编码类型”;”。“@charset”规则可以指定样式表中使用的字符编码,它必须是样式表中的第一个元素,并且不能以任何字符开头。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • js如何修改css

    js修改css的方法:1、使用【obj.style.cssTest】来修改嵌入式的css;2、使用【bj.className】来修改样式表的类名;3、使用更改外联的css文件,从而改变元素的css。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js修改css的方法: 方法…

    2025年12月24日
    000
  • js如何改变css样式

    js改变css样式的方法:1、使用cssText方法;2、使用【setProperty()】方法;3、使用css属性对应的style属性。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js改变css样式的方法: 第一种:用cssText div.style.cssText…

    2025年12月24日
    000
  • 为什么css放上面js放下面

    css放上面js放下面的原因:1、在加载html生成DOM tree的时候,可以同时对DOM tree进行渲染,这样可以防止闪跳,白屏或者布局混乱;2、javascript加载后会立即执行,同时会阻塞后面的资源加载。 本文操作环境:Windows7系统、HTML5&&CSS3版,DE…

    2025年12月24日
    000
  • 推荐六款移动端 UI 框架

    作为一个前端人员来说,总结几款相对来说不错的用于移动端开发的UI框架是非常必要的,以下几种移动端UI框架就能基本满足工作中开发需要,根据项目需求,选用合适的框架搭建项目,更能容易提高开发效率。 一、MUI         最接近原生APP体验的高性能前端框架,追求性能体验,是我们开始启动MUI项目的…

    2025年12月24日
    000
  • css如何实现图片的旋转展示效果(代码示例)

    本篇文章给大家带来内容是通过代码示例介绍使用css+js实现图片的旋转展示,制作一个手动操作的“无限”照片轮播图。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 下面我们就开始介绍如何实现效果。 1、构建图像轮播框架 首先是HTML。它有点难以阅读,因为我们删除了元素之间的任何空格…

    2025年12月24日
    000
  • css3+js实现烟花绽放的动画效果(代码示例)

    本篇文章给大家介绍通过js+css3的transforms属性和keyframes属性来实现烟花绽放的动画效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来看看效果: 动画的实现原理: 动画使用了两个关键帧(keyframes): 一个是烟花筒上升的轨迹,另一个…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信