RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1591374
Accepted
polsok
polsok
Asked:2024-08-21 00:41:53 +0000 UTC2024-08-21 00:41:53 +0000 UTC 2024-08-21 00:41:53 +0000 UTC

将yaml文件解析成表

  • 772

有几个yaml文件:

文件1

 phone:
   os: android
   size:
     length: 80
     height: 10
     weight: 40
   model: SE-35
   price: 20000

文件2

 phone:
   os: apple
   model: Iphone 15
   price: 150000
   color: gold

文件3

 phone:
   os: apple
   model: Iphone 15
   color: black
   exist: absent

文件4

 phone:
   os: android
   size:
     length: 75
     height: 8
     weight: 36
   camera:
     front: 4 mp
     back: 64 mp
       zoom: 3
   model: SE-35
   price: 20000

它们需要以表格形式呈现,其中第一列是键,其余是值。

该表将如下所示:

电话 文件1 文件2 文件3 文件4
电话操作系统 安卓 苹果 苹果 安卓
手机.尺寸.长度 80 75
手机.尺寸.高度 10 8
手机.尺寸.重量 40 35
手机型号 SE-35 iPhone 15 iPhone 15
电话.价格 20000 150000 20000
电话颜色 金子 黑色的
电话.存在 缺席的
手机.相机.前置 4 议员
电话.相机.返回 64 点
手机.相机.后退.缩放 3

其实这样的文件还有很多,我只是举了一些例子

我试图解析它们:这是代码:

import os
import yaml
import pandas as pd

# получаем данные из файла
def GetData(data, prefix):
  if isinstance(data, dict):
    for k, v in data.items():
        yield from GetData(v, f'{prefix}/{k}')
  else:
    yield (prefix, data)

# находим все файлы в директории
def findYamlFiles(directory):
  for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.yaml' or '.yml'):
            with open(os.path.join(root, file), 'r') as f:
              yaml_data = yaml.safe_load(f)
              df = pd.DataFrame(GetData(yaml_data, ''), columns=['phone', 'rezults'])

path = "~/phones"
findYamlFiles(path)

总的来说,在 df 中我得到了一个完全解析的 yaml 文件,由两列组成,但我无法将所有 df 收集到一张表中。

python
  • 3 3 个回答
  • 88 Views

3 个回答

  • Voted
  1. Maksim Alekseev
    2024-08-21T01:37:04Z2024-08-21T01:37:04Z

    如果全部df具有相同的结构:

    def findYamlFiles(directory):
        main_df = None
        all_df = []
        for root, dirs, files in os.walk(directory):
            for file in files:
                if file.endswith('.yaml' or '.yml'):
                    with open(os.path.join(root, file), 'r') as f:
                        yaml_data = yaml.safe_load(f)
                        all_df.append(pd.DataFrame(GetData(yaml_data, ''), columns=['Column 1', 'Column 2']))
    
    • 1 个选项
    print(pd.concat(all_df, ignore_index=True))
    

    结论:

                  Column 1 Column 2
    0            /phone/os  android
    1   /phone/size/length       80
    2   /phone/size/height       10
    3   /phone/size/weight       40
    4         /phone/model    SE-35
    5         /phone/price    20000
    6            /phone/os  android
    7   /phone/size/length       80
    8   /phone/size/height       10
    9   /phone/size/weight       40
    10        /phone/model    SE-35
    11        /phone/price    20000
    
    • 选项2
    print(pd.concat(all_df, axis=1))
    

    结论:

                 Column 1 Column 2            Column 1 Column 2
    0           /phone/os  android           /phone/os  android
    1  /phone/size/length       80  /phone/size/length       80
    2  /phone/size/height       10  /phone/size/height       10
    3  /phone/size/weight       40  /phone/size/weight       40
    4        /phone/model    SE-35        /phone/model    SE-35
    5        /phone/price    20000        /phone/price    20000
    
    • 选项3
    print(pd.merge(*all_df, on='Column 1'))
    

    结论:

                 Column 1 Column 2_x Column 2_y
    0           /phone/os    android    android
    1  /phone/size/length         80         80
    2  /phone/size/height         10         10
    3  /phone/size/weight         40         40
    4        /phone/model      SE-35      SE-35
    5        /phone/price      20000      20000
    
    • 4个选项(超过2个文件)
    df = pd.DataFrame(GetData(yaml_data, ''), columns=['Column 1', file])
    if main_df is None:
        main_df = df
        continue
    main_df = pd.merge(main_df, df, on="Column 1")
    

    结论:

                 Column 1 car.yaml car2.yaml car3.yaml
    0           /phone/os  android   android   android
    1  /phone/size/length       80        80        80
    2  /phone/size/height       10        10        10
    3  /phone/size/weight       40        40        40
    4        /phone/model    SE-35     SE-35     SE-35
    5        /phone/price    20000     20000     20000
    

    pd.合并

    pd.concat

    • 2
  2. Best Answer
    strawdog
    2024-08-22T03:44:36Z2024-08-22T03:44:36Z

    一般来说,您可能可以只使用json_normalize:

    files = ["f1.yaml", "f2.yaml", "f3.yaml", "f4.yaml"]
    
    def framify(filename: str):
        with open(filename, "r") as f:
            retval = pd.DataFrame(pd.json_normalize(yaml.safe_load(f))).T
            retval = retval.rename(columns={0:filename})
        return retval
        
    res = pd.concat([framify(file) for file in files], axis=1)
    

    资源:

                        f1.yaml    f2.yaml    f3.yaml  f4.yaml
    phone.os            android      apple      apple  android
    phone.size.length        80        NaN        NaN       75
    phone.size.height        10        NaN        NaN        8
    phone.size.weight        40        NaN        NaN       36
    phone.model           SE-35  Iphone 15  Iphone 15    SE-35
    phone.price           20000     150000        NaN    20000
    phone.color             NaN       gold      black      NaN
    phone.exist             NaN        NaN     absent      NaN
    phone.camera.front      NaN        NaN        NaN     4 mp
    phone.camera.back       NaN        NaN        NaN    64 mp
    phone.camera.zoom       NaN        NaN        NaN        3
    
    • 2
  3. SVBazuev
    2024-08-21T04:38:41Z2024-08-21T04:38:41Z

    您可以以不同的方式构建数据:

    import os
    import yaml
    import pandas as pd
    from rich import print, inspect
    
    # Укажите путь к директории с YAML-файлами
    directory_path = r'C:\YAMLs'
    
    # Словарь для хранения данных
    data = {}
    
    # Проходим по всем файлам в директории
    for filename in os.listdir(directory_path):
        if filename.endswith('.yaml') or filename.endswith('.yml'):
            file_path = os.path.join(directory_path, filename)
    
            # Читаем YAML-файл
            with open(file_path, 'r', encoding='utf-8') as file:
                yaml_content = yaml.safe_load(file)
                phone_data = yaml_content['phone']
                # Добавляем данные в словарь
                data[filename] = {
                    'os': phone_data['os'],
                    'size.length': phone_data['size']['length'],
                    'size.height': phone_data['size']['height'],
                    'size.weight': phone_data['size']['weight'],
                    'model': phone_data['model'],
                    'price': phone_data['price']
                }
    
    # Создаем DataFrame
    df = pd.DataFrame(data).T
    
    # Устанавливаем многоуровневый индекс для столбцов
    df.columns = pd.MultiIndex.from_product([['phone'], df.columns])
    
    # Печатаем результат
    inspect(df, value=True)
    

    输出:

    ╭───────────────── <class 'pandas.core.frame.DataFrame'> ──────────────────╮
    │ Two-dimensional, size-mutable, potentially heterogeneous tabular data.   │
    │                                                                          │
    │ ╭──────────────────────────────────────────────────────────────────────╮ │
    │ │ │   │   │    phone                                                   │ │
    │ │ │   │   │   │   os size.length size.height size.weight  model  price │ │
    │ │ pho.yaml       ios          90          10          50  fE-35  70000 │ │
    │ │ pho2.yml   android          80          12          40  SE-35  20000 │ │
    │ │ pho3.yaml  windows         100          10          50  QE-95  37000 │ │
    │ ╰──────────────────────────────────────────────────────────────────────╯ │
    ~                                                                          ~
    ╰──────────────────────────────────────────────────────────────────────────╯
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5