从JSON文件加载数据

时间:2014-03-02 04:36:21

标签: python json python-2.7

我正在尝试从JSON文件中获取一些数据。这是代码 -

import csv
import json
ifile  = open('facebook.csv', "rb")
reader = csv.reader(ifile)

rownum = 0
for row in reader:
    try:
        csvfile = open('facebook.csv', 'r')
        jsonfile = open('file.json', 'r+')
        fieldnames = ("USState","NOFU2008","NOFU2009","NOFU2010", "12MI%", "24MI%")
        reader = csv.DictReader( csvfile, fieldnames)
        for row in reader:
            json.dump(row, jsonfile)
            jsonfile.write('\n')
        data = json.load(jsonfile)
        print data["USState"]
    except ValueError:
        continue

我没有在控制台上获得print语句的任何输出。 JSON采用以下格式

{"USState": "US State", "12MI%": "12 month increase %", "24MI%": "24 month increase %", "NOFU2010": "Number of Facebook UsersJuly 2010", "NOFU2008": "Number of Facebook usersJuly 2008", "NOFU2009": "Number of Facebook UsersJuly 2009"}
{"USState": "Alabama", "12MI%": "109.3%", "24MI%": "400.7%", "NOFU2010": "1,452,300", "NOFU2008": "290,060", "NOFU2009": "694,020"}

我希望像所有行一样访问NOFU2008。

2 个答案:

答案 0 :(得分:1)

问题在于您创建JSON文件的方式。您不希望每行使用json.dump(),然后将其附加到JSON文件。

要创建JSON文件,首先应该在Python中创建一个以您希望的方式表示整个文件的数据结构,然后仅调用json.dump()一次以将整个结构转储为JSON格式。

对整个文件进行一次json.dump()调用,以确保它是有效的JSON。

我还建议将列表/行数组包装在dict / object中,这样就可以放置与整个JSON文件相关的其他属性,而不是单行。

看起来你facebook.csv的前几行是这样的(有或没有引号):

"US State","12 month increase %","24 month increase %","Number of Facebook UsersJuly 2010","Number of Facebook usersJuly 2008","Number of Facebook UsersJuly 2009"
"Alabama","109.3%","400.7%","1,452,300","290,060","694,020"

假设我们想要从中生成这个JSON文件(为了清楚起见,在这里缩进):

{
    "rows": [
        {
            "USState": "US State",
            "12MI%": "Number of Facebook usersJuly 2008",
            "24MI%": "Number of Facebook UsersJuly 2009",
            "NOFU2010": "Number of Facebook UsersJuly 2010",
            "NOFU2008": "12 month increase %",
            "NOFU2009": "24 month increase %"
        },
        {
            "USState": "Alabama",
            "12MI%": "290,060",
            "24MI%": "694,020",
            "NOFU2010": "1,452,300",
            "NOFU2008": "109.3%",
            "NOFU2009": "400.7%"
        }
    ]
}

请注意,JSON文件的顶级是一个对象(不是数组),并且此对象具有rows属性,即行数组。

我们可以创建这个JSON文件并使用以下Python代码进行测试:

import csv
import json

# Read the CSV file and convert it to a list of dicts
with open( 'facebook.csv', 'rb' ) as csvfile:
    fieldnames = (
        "USState", "NOFU2008", "NOFU2009", "NOFU2010",
        "12MI%", "24MI%"
    )
    reader = csv.DictReader( csvfile, fieldnames )
    rows = list( reader )

# Wrap the list inside an outer dict
wrap = {
    'rows': rows
}

# Format and write the entire JSON in one fell swoop
with open( 'file.json', 'wb' ) as jsonfile:
    json.dump( wrap, jsonfile )

# Now test the file by reading it and parsing it
with open( 'file.json', 'rb' ) as jsonfile:
    data = json.load( jsonfile )

# For fun, convert the data back to JSON again and pretty-print it
print json.dumps( data, indent=4 )

一些注意事项......此代码没有原始的嵌套阅读器循环。我不知道那是为了什么。一个读者应该就够了。

实际上,这个版本根本不使用循环。该行生成读者对象的行列表:

    rows = list( reader )

还要密切关注使用with打开CSV和JSON文件的位置。这是打开文件的好方法,因为该文件将在with块的末尾自动关闭。

现在说了这一切,我不得不怀疑这个确切的JSON结构是否是你真正想要的?看起来CSV的第一行是标题行,所以你可能想跳过那一行?您可以在将其余CSV数据转换为列表之前添加reader.next()调用,轻松完成此操作:

reader.next()
    rows = list( reader )

此外,我不确定我是否了解您希望如何访问结果数据。您将无法使用data["USState"],因为USState是每个单独行对象的属性。所以再说一下你想如何访问数据,我们可以对其进行排序。

答案 1 :(得分:0)

如果你想在文件中创建一个json对象列表,那么你应该告诉自己json中的列表是什么样的。

如果列表元素用逗号分隔,你应该把这样的东西放到代码中:

jsonfile.write(',\n')