Python 3读取行内缺少对象的json文件

时间:2017-07-26 13:37:33

标签: python json python-3.x

我正在阅读一个带有以下结构的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

因此,在这种情况下,我无法使用类似于读取值的默认值,因为我需要向我的方法发送一些值。

当你们缺少对象时,你们中的一些人会知道应该如何阅读这种文件的最佳方法。谢谢

3 个答案:

答案 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)