2017-07-26 62 views
3

我读一个JSON文件与下面的结构内的JSON文件:的Python 3阅读缺失对象行

[{"id":1,"gender":"Male","first_name":"Andrew","last_name":"Scott","email":"[email protected]","ville":"Connecticut"}, 
{"id":3,"first_name":"Mary","last_name":"Richards","email":"[email protected]","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

答案球员之前,你应该知道,我必须定义“性别”的默认值的方法,瞧我的方法: –

+0

你所要求的是不明确的。您有一种方法可以始终为性别字段赋予一个值,但是在某些情况下,您的json没有性别字段。现在,你需要处理这些情况(这绝不应该由于你的'definegender()')而发生,但不想使用错误处理和默认值......所以,你期望的结果是什么? – mrnfrancesco

+1

@mrnfrancesco这里是事情。我需要阅读文件并逐行检查字段以创建一个名为“person”的类对象,以确保总是性别为M或F或UNKNOWN。我创建了此方法。事情是,我不能只是将字段传递给我的方法cuz有时它不是来自源文件。 :( –

回答

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修正misstake

try: 
    gender = definegender(line["gender"]) 
except KeyError: 
    gender = definegender(None) 
print(line["id"],gender) 

UPDATE3:(为未来的目的)

为获得()返回无默认情况下,最简单的办法是

gender = definegender(line.get("gender")) 
print(line["id"],gender) 
+0

看看我的版本关于如何玩验证性别的方法。谢谢 –

+1

ok @AndresAngel我看了并更新了我的答案,尽管我不是100%确定你在问什么。 –

+0

你对的东西是我试图从一个类使用这个for循环来创建一个“人类”的对象来阅读json文件。我会尝试你的方法谢谢你的朋友 –

6

为什么不在dict.get的字典中使用默认值?

print(line["id"],line.get("gender","unknown")) 

而且因为要进一步转变输入,你可以窝2 dict.get在一起,第一个与None为默认值,以及一个新的表,如下所示:

gender_dict = {"Male":"M", "Female":"F", None : "unknown"} 

print(line["id"],gender_dict.get(line.get("gender"))) 

(注意,你不需要你的复杂的性别转换方法了)

+0

我只是在我的问题中添加另一个细节因为我需要运行一种方法来设置性别的默认值。谢谢 –

+0

@AndresAngel我认为我的新编辑将适合你(并且比你更简单原来的方法) –

0

为什么不简化这个wi一个if语句?

for line in data: 
    if "gender" in line: 
     print(line) 
+0

请看我的版本文章玩验证性别的方法。谢谢 –