JSON
JSON(JavaScript Object Notation, JS 對象標記)是一種輕量級的數據交換格式,易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。
它基於ECMAScript(w3c制定的js規范)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得JSON成為理想的數據交換語言。
JSON支持數據格式:
- 對象(字典)。使用花括號。
- 數組(列表)。使用方括號。
- 整形、浮點型、布爾類型還有null類型。
- 字符串類型(字符串必須要用雙引號,不能用單引號)。
多個數據之間使用逗號分開。注:json本質上就是一個字符串。
JSON函數
使用JSON函數需要導入json庫:import json
。
函數 | 描述 |
---|---|
json.dumps |
將Python對象編碼成JSON字符串 |
json.loads |
將已編碼的JSON字符串解碼為Python對象 |
另外:
json.dump()
和json.load()
主要用來讀寫json文件函數。
字典和列表轉JSON
import json
books = [
{
'title': 'Python基礎',
'price': '79.00'
},
{
'title': 'Scrapy網絡爬蟲',
'price': '56.00'
}
]
json_str = json.dumps(books)
print('type: ', type(json_str))
print('json_str: ', json_str)
# 輸出:
type: <class 'str'>
json_str: [{"title": "Python\u57fa\u7840", "price": "79.00"}, {"title": "Scrapy\u7f51\u7edc\u722c\u866b", "price": "56.00"}]
注:因為json在dump的時候,只能存放ASCII
的字符,因此會將中文進行轉義,這時候我們可以使用ensure_ascii=False
關閉這個特性。
更改之后:
json_str = json.dumps(books, ensure_ascii=False)
# 輸出:
[{"title": "Python基礎", "price": "79.00"}, {"title": "Scrapy網絡爬蟲", "price": "56.00"}]
注:Python中,只有基本數據類型才能轉換成JSON格式的字符串,即:int
、float
、str
、list
、dict
、tuple
。
將json數據直接dump到文件中
常規方式:
import json
books = [
{
'title': 'Python基礎',
'price': '79.00'
},
{
'title': 'Scrapy網絡爬蟲',
'price': '56.00'
}
]
json_str = json.dumps(books, ensure_ascii=False)
with open('books.json', 'w') as fp:
fp.write(json_str)
打開books.json文件發現出現了亂碼:
[{"title": "Python����", "price": "79.00"}, {"title": "Scrapy��������", "price": "56.00"}]
然后指定文件編碼方式:
with open('books.json', 'w', encoding='utf8') as fp:
fp.write(json_str)
重新打開books.json文件發現一切正常:
[{"title": "Python基礎", "price": "79.00"}, {"title": "Scrapy網絡爬蟲", "price": "56.00"}]
json模塊中除了dumps函數,還有一個dump函數,這個函數可以傳入一個文件指針,直接將字符串dump到文件中。
import json
books = [
{
'title': 'Python基礎',
'price': '79.00'
},
{
'title': 'Scrapy網絡爬蟲',
'price': '56.00'
}
]
with open('books.json', 'w', encoding='utf8') as fp:
json.dump(books, fp)
# 輸出:
[{"title": "Python\u57fa\u7840", "price": "79.00"}, {"title": "Scrapy\u7f51\u7edc\u722c\u866b", "price": "56.00"}]
關閉中文轉義:
with open('books.json', 'w', encoding='utf8') as fp:
json.dump(books, fp, ensure_ascii=False)
# 輸出:
[{"title": "Python基礎", "price": "79.00"}, {"title": "Scrapy網絡爬蟲", "price": "56.00"}]
將一個json字符串load成Python對象
import json
json_str = '[{"title": "Python基礎", "price": "79.00"}, {"title": "Scrapy網絡爬蟲", "price": "56.00"}]'
books = json.loads(json_str)
print('type: ', type(books))
print('boos: ', books)
# 輸出:
type: <class 'list'>
boos: [{'title': 'Python基礎', 'price': '79.00'}, {'title': 'Scrapy網絡爬蟲', 'price': '56.00'}]
直接從文件中讀取json:
import json
# 注意指定文件編碼方式
with open('books.json', 'r', encoding='utf8') as fp:
json_str = json.load(fp)
print(json_str)
# 輸出:
[{'title': 'Python基礎', 'price': '79.00'}, {'title': 'Scrapy網絡爬蟲', 'price': '56.00'}]
csv文件處理
讀取csv文件
import csv
with open('stock.csv','r') as fp:
reader = csv.reader(fp)
titles = next(reader)
for x in reader:
print(x)
這樣操作,以后獲取數據的時候,就要通過下表來獲取數據。如果想要在獲取數據的時候通過標題來獲取。那么可以使用DictReader:
import csv
with open('stock.csv','r') as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x['turnoverVol'])
寫入數據到csv文件
寫入數據到csv文件,需要創建一個writer對象,主要用到兩個方法。一個是writerow,這個是寫入一行。一個是writerows,這個是寫入多行:
import csv
headers = ['name','age','classroom']
values = [
('zhiliao',18,'111'),
('wena',20,'222'),
('bbc',21,'111')
]
with open('test.csv','w',newline='') as fp:
writer = csv.writer(fp)
writer.writerow(headers)
writer.writerows(values)
也可以使用字典的方式把數據寫入進去。這時候就需要使用DictWriter了:
import csv
headers = ['name','age','classroom']
values = [
{"name":'wenn',"age":20,"classroom":'222'},
{"name":'abc',"age":30,"classroom":'333'}
]
with open('test.csv','w',newline='') as fp:
writer = csv.DictWriter(fp,headers)
writer = csv.writeheader()
writer.writerow({'name':'zhiliao',"age":18,"classroom":'111'})
writer.writerows(values)
參考:
Python JSON: http://www.runoob.com/python/python-json.html
python中json文件處理涉及的四個函數json.dumps()和json.loads()、json.dump()和json.load()的區分: https://www.cnblogs.com/xiaomingzaixian/p/7286793.html