的問題是要創建的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
是每個單獨行對象的屬性。所以,多說一點你想訪問數據的方式,我們可以把它整理出來。
你的JSON格式化了嗎?這不是有效的JSON。它需要在一個數組中。 – Shadaez
@Shadaez - 是的,我只是複製粘貼我的JSON文件的前兩行在這個問題。這是否意味着我在創建JSON文件時發生錯誤?我從CSV文件中提取東西,然後在循環中創建一個JSON文件 – newbie
是的,我首先寫一個'['然後每當你寫一行時在新行之前添加一個',',除了最後一行在那裏你只需添加一個']'。你也需要讀取數組中的每一個值,所以'對於數據行''data [「USState」]' – Shadaez