2014-03-02 105 views
2

我想從JSON文件中獲取一些數據。這裏是它的代碼 -從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訪問所有行。

+0

你的JSON格式化了嗎?這不是有效的JSON。它需要在一個數組中。 – Shadaez

+0

@Shadaez - 是的,我只是複製粘貼我的JSON文件的前兩行在這個問題。這是否意味着我在創建JSON文件時發生錯誤?我從CSV文件中提取東西,然後在循環中創建一個JSON文件 – newbie

+0

是的,我首先寫一個'['然後每當你寫一行時在新行之前添加一個',',除了最後一行在那裏你只需添加一個']'。你也需要讀取數組中的每一個值,所以'對於數據行''data [「USState」]' – Shadaez

回答

0

如果你想在文件中創建json對象的列表,那麼你應該告訴你自己關於json的列表是什麼樣的。

在情況下元素通過你應該把這樣的事情到代碼中的逗號分隔:

jsonfile.write(',\n') 
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是每個單獨行對象的屬性。所以,多說一點你想訪問數據的方式,我們可以把它整理出來。