我正在阅读一个带有以下结构的json文件:
[{"id":1,"gender":"Male","first_name":"Andrew","last_name":"Scott","email":"ascott0@shutterfly.com","ville":"Connecticut"},
{"id":3,"first_name":"Mary","last_name":"Richards","email":"mrichards2@japanpost.jp","ville":"Minnesota"}]
所以,你可以在第二个“行”中看到字段“性别”它不存在。我意识到因为我读取文件的代码在这一行出错了。
我的代码:
import json
def jsonreader():
##Reader for json files
##Open files using json library
with open('cust_data.json') as file:
data = json.load(file)
resultlist = list()
for line in data:
print(line["id"],line["gender"])
我收到了错误: -
C:/xxxxx/x.py
1 Male
Traceback (most recent call last):
2 Female
File "C:/xxxxx/x", line 67, in <module>
jsonreader()
File "C:/xxxxx/x", line 56, in jsonreader
print(line["id"],line["gender"])
KeyError: 'gender'
在回答之前,你应该知道我有一种方法来定义“性别”中的默认值,瞧我的方法:
def definegender(x):
if x is None:
x = 'unknown'
return x
elif (x =='Male') or (x=='Female'):#not None:
return {
'Male':'M',
'Female': 'F'
}.get(x)
else:
return x
因此,在这种情况下,我无法使用类似于读取值的默认值,因为我需要向我的方法发送一些值。
当你们缺少对象时,你们中的一些人会知道应该如何阅读这种文件的最佳方法。谢谢
答案 0 :(得分:6)
为什么不在dict.get
中使用字典的默认值?
print(line["id"],line.get("gender","unknown"))
由于您希望进一步转换输入,您可以将两个dict.get
嵌套在一起,第一个嵌套None
作为默认值,以及一个新表,如下所示:
gender_dict = {"Male":"M", "Female":"F", None : "unknown"}
print(line["id"],gender_dict.get(line.get("gender")))
(请注意,您不再需要过度复杂的性别转换方法)
答案 1 :(得分:1)
虽然这已经有了完美的答案,但我的观点是,也有其他选择。所以这就是:
for line in data:
try:
print(line["id"],line["gender"])
except KeyError:
print(line["id"],"Error!!! no gender!")
这称为ErrorHandling。阅读文档: https://docs.python.org/3.6/tutorial/errors.html
更新:你的意思是? update2 更正了错误提示
try:
gender = definegender(line["gender"])
except KeyError:
gender = definegender(None)
print(line["id"],gender)
update3 :(以备将来使用)
as .get()默认返回None,最简单的解决方案是
gender = definegender(line.get("gender"))
print(line["id"],gender)
答案 2 :(得分:0)
为什么不用if语句来简化呢?
for line in data:
if "gender" in line:
print(line)