TypeError:'NoneType'对象不是可迭代问题。我该如何设法绕过空语句?
2019-04-06
355
我试图找到推文的发送位置,有些人显然没有在推文上设置位置,所以我想知道如何绕过“TypeError:'NoneType'对象不可迭代”并在其位置显示“未识别”答案?
我使用的代码是`import json
with open('tweets7.txt')as json_data:
data = json.load(json_data)
for r in data['results']:
for b in r['place']:
print (r['place']['full_name'])
break
print r['text']
`
3个回答
在这种情况下,您可以使用 try / catch :)
with open('tweets7.txt')as json_data:
data = json.load(json_data)
for r in data['results']:
try:
for b in r['place']:
print (r['place']['full_name'])
except TypeError:
print("location not identified")
print r['text']
David Silveiro
2019-04-06
如果要检查可迭代对象是否存在,可以使用:
isinstance(data['results'], list)
isinstance(data.get('results', None), list)
如果只想遍历data['results'],可以使用:
for r in data.get('results', []):
# Todo: your code
pass
cloudyyyyy
2019-04-06
如果您不能依赖输入来遵循您预期的格式,那么获得警告或至少比
KeyError
或
NoneType 不可迭代
更清晰的错误消息可能会很有用。
def get_tweets(filename):
with open(filename) )as json_data:
data = json.load(json_data)
if 'results' not in data:
raise ValueError("No 'results' in {0!r}".format(data))
if data['results'] is None:
return []
for r in data['results']:
if 'place' not in r:
raise ValueError("No 'place' in {0!r}".format(r))
if r['place'] is not None:
for b in r['place']:
print('.… Oops, forgot to do anything with b')
print (r['place']['full_name'])
break
if 'text' not in r:
raise ValueError("No 'text' in {0!r}".format(r))
print r['text']
get_tweets('tweets7.txt')
如果您不习惯编写健壮的代码,那么一开始在每个可能的机会都引发错误似乎很奇怪。这里的关键教训是提供
有用的
错误报告来指示
到底
出了什么问题。您很快就会发现这显著提高了代码的可用性和可维护性;您不会看到距离实际问题发生地点可能有几十行的奇怪的、不具描述的
NoneType
回溯,而是会立即收到错误,该错误会准确显示某些事情并非您所期望的。
如果您认为您能够在调用代码中处理其中一些错误,请注意在每种情况下
raise
不同的错误,以便您可以准确决定要实现哪些
except
处理程序。(然后可能定义您自己的错误层次结构,而不是像我在这里所做的那样使用 Python 的通用
ValueError
。)
tripleee
2019-04-06