json文件的一部分消失

时间:2021-02-08 09:22:43

标签: python json python-3.x

import codecs, json

line, aktualny_workout, workout_data = None

def czytaj_workout(_line):
    aktualny_workout = codecs.open(_line.strip(), 'r', 'utf-8', 'ignore')
    workout_data = json.load(aktualny_workout)
    return

with codecs.open('./output.txt', 'r', 'utf-8', 'ignore') as f:
    line = f.readline()
    while line:
        czytaj_workout(line)
        line = f.readline()


location_dic = workout_data[0]['points']
print("latitude: ", latitude_dic['latitude'])
print("longitude: ", longitude_dic['longitude'])
print(workout_data[0]['comments']) # >>> KeyError: 'comments'
print([*workout_data]) # rzeczywiście, brakuje sekcji comments
                       # indeed, there is no 'comments' key in workout_data
                       #it's stunnin'

因为 Endomondo Sport Tracker 退出,他们向用户发送包含所有存储数据的存档(应要求)。 我想从中构建一个漂亮的pdf文件。 上面的片段从 Endomondo 锻炼列表中读取文件名 并打印出一些数据。 问题是,它在“点”标签/键之后看不到任何数据。并且有标签/键“评论”。谁能解释一下会发生什么?

这是我处理的部分数据:

[
    {"name": "z Marianowa"},
    {"sport": "CYCLING_TRANSPORTATION"},
    {"source": "TRACK_MOBILE"},
    {"created_date": "2012-07-12 15:16:18.0"},
        .
        .
        .
    {"descend_m": 180},
    {"points": [
        [
            {"location": [[
                {"latitude": 53.3775774},
                {"longitude": 15.2635784}
            ]]},
            {"altitude": 81.5},
            {"timestamp": "Thu Jul 12 12:07:41 UTC 2012"}
        ],
        [
            {"location": [[
                {"latitude": 53.377387},
                {"longitude": 15.2634523}
            ]]},
            {"altitude": 81.5},
            {"distance_km": 0.022},
            {"speed_kmh": 15.52},
            {"timestamp": "Thu Jul 12 12:07:46 UTC 2012"}
        ],

    ]},
    {"comments": [[
        {"author": "Andrzej Kryński"},
        {"created_date": "2012-07-12 15:41:54.0"},
        {"text": "Lepiej jechać przez Pęzino i Ulikowo: mały ruch, prawie żaden więc bezpiecznie, dobra nawierzchnia i najlepsze osiągi na tym odcinku."}
    ]]}
]

1 个答案:

答案 0 :(得分:1)

建议:

  • 我建议在 Python 3 中使用 pathlib 进行文件处理。
  • 您需要停止将 training_data 视为函数内部的全局变量, 如果您打算使用函数返回您更改的变量(有例外,但现在只接受此作为一般规则)。
  • 观看此"loop like a native video",您就会明白我为什么像下面那样重构您的 while 循环。
  • 当您处理字典数据时,您不确定是否会存在,请使用 .get() 语法而不是 d["variable"]。 .get() 尝试它,但如果没有找到,则返回 None 。另一只手返回一个错误。
  • 下次您在 SO 上提出问题时,请提供一些数据,以便我们了解我们正在使用的内容。

编辑:在 json 文件发布后,我发现格式很糟糕,但它完全是 json 文件,而不是带有 json 记录的文件。所以首先要做的是修复格式。

import json
from pathlib import Path

my_file = Path('./output.txt')

bad_data_format = json.loads(my_file.read_text())
workout_data = dict()
for x in bad_data_format:
    workout_data.update(x)
bad_points_format = data.get('points')

# the same technique need to be used on bad_points_format as bad_data_format.  I leave this to homework

print(f"comments: {workout_data.get('comments')}")