【发布时间】:2018-08-17 10:30:18
【问题描述】:
我一直在使用 Python 从 JSON API 抓取和解析数据。具体来说,我正在使用 CTA(芝加哥交通管理局)火车跟踪器 API。
我会定期收到TypeError: string indices must be integers,我追踪到该邮件是存在多个“火车”运行的数组而不是单个“火车”运行的情况。单次运行不在运行数组中。
{'ctatt':
{'tmst': '2018-03-05T01:59:10',
'errCd': '0',
'errNm': None,
'route': [{'@name': 'g'},
{'@name': 'y',
'train': {'rn': '030',
.....
'heading': '302'},
{'@name': 'blue',
'train': [{'rn': '125',
.....
'heading': '302'},
{'rn': '127',
.....
'heading': '278'},
“g”路线没有运行实例。 'y' 路线有 1 个运行。
'train': {'rn':}
“蓝色”路线有多条线路。
'train': [{'rn': ...},{'rn': ...},{'rn': ...}]
我用来解析的代码处理了缺少运行和多次运行的问题。它以 1 次运行命中 TypeError。
for train_rt in trains_data['ctatt']['route']:
line_name = train_rt['@name']
if train_rt.get('train', 'None') != 'None':
for train_run in train_rt['train']:
仅处理不在数组中的单次运行的最佳方法是什么?
2 Yellow Line Runs in Chrome: Dev Tools: Network: Preview
1 Yellow Line Run in Chrome: Dev Tools: Network: Preview
我注意到的一个不一致之处是,如果我查询一条路线,这些路线仍然在一个由 1 条路线组成的数组中。
【问题讨论】:
-
不能检查
type的值到'train'键,然后根据需要处理吗? -
旁注:只需使用
if 'train' in train_rt:。使用'None'字符串没有任何优点,还有一个很大的缺点,就是你为什么要使用这样一个特殊的字符串值作为哨兵,这看起来令人困惑。 -
@MartijnPieters 我知道,默认返回是
'None',但我添加了该代码试图找出错误。我最初有if train_rt.get('train') != None:,但我确定有更好的方法吗?
标签: python arrays json api jagged-arrays