python - json文件的消失部分
问题描述
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 文件。上面的 Snipplet 从 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."}
]]}
]
解决方案
建议:
- 我建议在 Python 3 中使用 pathlib 进行文件处理。
- 如果您要使用函数返回您更改的变量,则需要停止将锻炼数据视为函数内部的全局变量(也有例外,但现在只需将其作为一般规则接受)。
- 观看这个“像原生视频一样的循环”,这样你就会明白为什么我像下面这样重组了你的 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')}")
推荐阅读
- google-apps-script - 具有多个范围和多个条件的用于条件格式的 Google 脚本
- python - Python lambda: filter(lambda (v,p): v!=p).count()。语法错误 &
() 缺少 1 个必需的位置参数 - reactjs - React:使用 useReducer 和 useContext 异步检索信息
- c# - 设置了主键但说没有定义?
- javascript - 在 vuejs 中设置 html5 数据属性不起作用
- javascript - 如何使用 expressjs 发送多个文件?
- asp.net-mvc - 如何从订单详情参数的订单模型中选择?asp.net mvc
- swift - 您如何设置文本字段标签,以便返回字段将转到下一个字段?这是在表格视图单元格内
- coq - 如何重命名假设中的存在量化变量?
- html - css网格中的动画项目