【问题标题】:Loading data from a JSON file从 JSON 文件加载数据
【发布时间】:2014-03-02 04:36:20
【问题描述】:

我正在尝试从 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

我在控制台上没有得到打印语句的任何输出。 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 一样访问所有行。

【问题讨论】:

  • 您的 JSON 格式是否完全一致?它不是有效的 JSON。它需要在一个数组中。
  • @Shadaez - 是的,我只是在这个问题中复制粘贴了我的 JSON 文件的前两行。这是否意味着我在创建 JSON 文件时出错了?我正在从 CSV 文件中提取内容并在该 for 循环中创建一个 JSON 文件
  • 是的,我会先写一个“[”,然后每当你写一行时,在新行之前添加一个“,”,除了最后一行,你只需添加一个“]” .你也想读取数组中的每个值,所以for line in datadata["USState"]
  • 如果您不确定它是否正确,请将创建的 JSON 放入 jsonlint.com 并进行验证。它会告诉你出了什么问题。
  • 糟糕,cmets 的意思是 line["USState"] 我不熟悉 python 的 json 库,但我知道这两行的格式不正确。

标签: python json python-2.7


【解决方案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 )

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

现在说了这么多,我想知道这个确切的 JSON 结构是否是你真正想要的?看起来 CSV 的第一行是标题行,所以您可能想跳过该行?在将其余 CSV 数据转换为列表之前,您可以通过添加 reader.next() 调用轻松做到这一点:

reader.next()
    rows = list( reader )

另外,我不确定我是否了解您希望如何访问结果数据。您将无法使用data["USState"],因为USState 是每个单独的行对象的属性。因此,请多说一些关于您希望如何访问数据的信息,我们可以对其进行整理。

【讨论】:

    【解决方案2】:

    如果您想在文件中创建一个 json 对象列表,那么您应该了解一下 json 中的列表是什么样的。

    如果列表元素用逗号分隔,您应该在代码中添加如下内容:

    jsonfile.write(',\n')
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2017-01-06
      • 2018-05-11
      • 2020-02-28
      • 2012-02-28
      • 2013-08-28
      • 2012-06-10
      • 2017-06-01
      • 2016-04-14
      相关资源
      最近更新 更多