我正在尝试从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。
答案 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')