【问题标题】:How to convert complicated JSON file structure to CSV in Python?如何在 Python 中将复杂的 JSON 文件结构转换为 CSV?
【发布时间】:2018-08-14 13:23:35
【问题描述】:

这就是 JSON 结构的样子。我已从数据中取出个人信息。

{
    "Version": "1.0",
    "IsUpToDate": false,
    "LastModificationGUID": "{numbers}",
    "DisplayName": "DATE",
    "CreateDate": "DATE AND TIME",
    "ServerID": 0,
    "CreatorServerID": 0,
    "TournamentID": "NUMBERS",
    "PitchMoundDistance": NUMBER,
    "SensorModel": 20,
    "Results": [
        {
            "Guid": "{NUMBERS}",
            "PitchServerID": 0,
            "HitServerID": 0,
            "PitchResult": {
                "LaunchSpeed": LONG FLOATING NUMBER,
                "LaunchAzimDeg": LONG FLOATING NUMBER,
                "LaunchElevDeg": LONG FLOATING NUMBER,
                "BackspinRPM": -NUMBER,
                "SidespinRPM": -NUMBER,
                "RiflespinRPM": -NUMBER,
                "X": [
                    -LONG FLOATING NUMBER,
                    LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER,
                    LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER
                ],
                "Y": [
                    LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER,
                    LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER
                ],
                "Z": [
                    LONG FLOATING NUMBER,
                    LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER,
                    -LONG FLOATING NUMBER,
                    LONG FLOATING NUMBER
                ],
                "FlightTime": LONG FLOATING NUMBER,
                "TrackTime": LONG FLOATING NUMBER,
                "StartPositionX": -LONG FLOATING NUMBER,
                "StartPositionY": LONG FLOATING NUMBER,
                "StartPositionZ": LONG FLOATING NUMBER,
                "StrikeZoneFrontPositionX": LONG FLOATING NUMBER,
                "StrikeZoneFrontPositionY": LONG FLOATING NUMBER,
                "StrikeZoneFrontPositionZ": LONG FLOATING NUMBER,
                "StrikeZoneFrontTime": LONG FLOATING NUMBER,
                "StrikeZoneBackPositionX": LONG FLOATING NUMBER,
                "StrikeZoneBackPositionY": LONG FLOATING NUMBER,
                "StrikeZoneBackPositionZ": LONG FLOATING NUMBER,
                "StrikeZoneBackTime": LONG FLOATING NUMBER,
                "BreakDistance": LONG FLOATING NUMBER,
                "MovementDistance": LONG FLOATING NUMBER,
                "Extension": LONG FLOATING NUMBER,
                "MLBSpinAxisDeg": LONG FLOATING NUMBER,
                "MLBSpinTiltHoursOnly": 12,
                "MLBSpinTiltHours": 12,
                "MLBSpinTiltMinutes": 15,
                "MLBHBreak": LONG FLOATING NUMBER,
                "MLBVBreak": -LONG FLOATING NUMBER,
                "MLBVBreakInduced": LONG FLOATING NUMBER,
                "MLBHMovement": -LONG FLOATING NUMBER,
                "MLBVMovement": LONG FLOATING NUMBER,
                "SimpleHBreak": LONG FLOATING NUMBER,
                "SimpleVBreak": LONG FLOATING NUMBER,
                "SimpleHMovement": -LONG FLOATING NUMBER,
                "SimpleVMovement": LONG FLOATING NUMBER,
                "PFX_X": LONG FLOATING NUMBER,
                "PFX_Z": LONG FLOATING NUMBER,
                "PX": LONG FLOATING NUMBER,
                "PZ": LONG FLOATING NUMBER,
                "X0": -LONG FLOATING NUMBER,
                "Y0": LONG FLOATING NUMBER,
                "Z0": LONG FLOATING NUMBER,
                "VX0": LONG FLOATING NUMBER,
                "VY0": -LONG FLOATING NUMBER,
                "VZ0": LONG FLOATING NUMBER,
                "AX": LONG FLOATING NUMBER,
                "AY": LONG FLOATING NUMBER,
                "AZ": -LONG FLOATING NUMBER,
                "ApproachSpeed": LONG FLOATING NUMBER,
                "ApproachAzimDeg": LONG FLOATING NUMBER,
                "ApproachElevDeg": -LONG FLOATING NUMBER
            },
            "Batter": "",
            "TriggerTime": "DATE WITH TIME",
            "PitchTypeShortCode": "FC",
            "PitchMechanicsShortCode": "ST",
            "PitchResultShortCode": "B",
            "PitchTypeDescription": "Cutter",
            "PitchMechanicsDescription": "Stretch",
            "PitchResultDescription": "Ball",
            "StrikeZoneTop": LONG FLOATING NUMBER,
            "StrikeZoneBottom": 0.5,
            "PitchStrikeZonePosition": 9,
            "PitcherName": "NAME",
            "PitcherID": "{NUMBERS AND LETTERS}",
            "PitcherIDType": "",
            "PitcherTeam": "NAME",
            "BatterName": "NAME",
            "BatterID": "{NUMBERS AND LETTERS}",
            "BatterIDType": "",
            "BatterTeam": "NAME",
            "PitchHandedness": "R",
            "SwingHandedness": "R",
            "HomeTeamBatting": false,
            "PAOfInning": 0,
            "PitchOfPA": 0
        },
        {

逗号后的结构是这样的。结构中最重要的部分是 Result 属性。我曾尝试在 Python 中展平文件,但它无法转换为数据框。我想将其转换为 CSV,以便在 PowerBI 中进行可视化。感谢您的帮助!

【问题讨论】:

    标签: python json pandas powerbi


    【解决方案1】:

    JSON 文件和 csv 文件有不同的用途。如果您的数据是嵌套的,并且您需要访问其中的特定层 - JSON/字典将是您的选择。如果您正在寻找 DataFrame 类型的数据结构 - 使用 csv。 我建议你阅读更多关于这两个的内容:)

    编辑:在你写的数据中,我会使用 JSON

    【讨论】:

    • 可视化 JSON 的最佳方法是使用像上面那样的缩进或像 jsonviewer.stack.hu 这样的工具(如果你在代码中需要它,有开源项目可以做到这一点。)。如果这是您的问题,您不能像数据框或 csv 数据结构一样将它们可视化。
    【解决方案2】:

    转换 JSON 非常简单。一旦将其加载到 Python 中,数据就会变成字典。这些可以很容易地操作,例如:

    for key, value in my_dict.items():
        print('The key is : '.format(key)
        print('The value is : '.format(value)
    

    等等。我建议阅读 Python 字典,这样会更容易。

    【讨论】:

      【解决方案3】:

      这是一个简单的函数,可以漂亮地打印任意深度的 JSON 文件:

      my_dict = {'a': {'b' : 'c', 'd': {'e': 'f'}}, 'g': 'h'}
      
      def flatten_dict(some_dict, indent):
          for key, value in some_dict.items():
              print('    ' * indent + 'Key : {}'.format(key))
              if type(value) == dict:
                  indent += 1
                  flatten_dict(value, indent)
              else:
                  print('    ' * indent + 'Value : {}'.format(value))
      
      
      flatten_dict(my_dict, 0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-20
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2018-03-31
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多