欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中數(shù)據(jù)的多種存儲形式

 更新時間:2023年05月06日 14:51:25   作者:塵世風(fēng)  
這篇文章主要介紹了Python中數(shù)據(jù)的多種存儲形式,主要有JSON?文件存儲、CSV?文件存儲、關(guān)系型數(shù)據(jù)庫存儲及非關(guān)系型數(shù)據(jù)庫存儲,本文給大家介紹的非常詳細,需要的朋友可以參考下

1 JSON 文件存儲

JSON,全稱為 JavaScript Object Notation, 也就是 JavaScript 對象標記,它通過對象和數(shù)組的組合來表示數(shù)據(jù),構(gòu)造簡潔但是結(jié)構(gòu)化程度非常高,是一種輕量級的數(shù)據(jù)交換格式。本節(jié)中,我們就來了解如何利用 Python 保存數(shù)據(jù)到 JSON 文件。

1. 對象和數(shù)組

在 JavaScript 語言中,一切都是對象。因此,任何支持的類型都可以通過 JSON 來表示,例如字符串、數(shù)字、對象、數(shù)組等,但是對象和數(shù)組是比較特殊且常用的兩種類型,下面簡要介紹一下它們。

對象:它在 JavaScript 中是使用花括號 {} 包裹起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key1:value1, key2:value2, ...} 的鍵值對結(jié)構(gòu)。在面向?qū)ο蟮恼Z言中,key 為對象的屬性,value 為對應(yīng)的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。

數(shù)組:數(shù)組在 JavaScript 中是方括號 [] 包裹起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java", "javascript", "vb", ...] 的索引結(jié)構(gòu)。在 JavaScript 中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可以像對象那樣使用鍵值對,但還是索引用得多。同樣,值的類型可以是任意類型。

所以,一個 JSON 對象可以寫為如下形式:

[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
     "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]

由中括號包圍的就相當于列表類型,列表中的每個元素可以是任意類型,這個示例中它是字典類型,由大括號包圍。

JSON 可以由以上兩種形式自由組合而成,可以無限次嵌套,結(jié)構(gòu)清晰,是數(shù)據(jù)交換的極佳方式。

import json
data = [{
    'name': '王偉',
    'gender': '男',
    'birthday': '1992-10-18'
},{
    'name': '張三',
    'gender': '男',
    'birthday': '1993-10-18'
}]
# w 寫入  a  r
with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))
# json.dumps  把字典轉(zhuǎn)json字符串
# .loads   反序列化  把json字符串轉(zhuǎn)字典
# indent 格式化
# ensure_ascii=False  中文不編碼
# java 必須要雙引號

2 CSV 文件存儲

CSV,全稱為 Comma-Separated Values,中文可以叫作逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數(shù)據(jù)。該文件是一個字符序列,可以由任意數(shù)目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。不過所有記錄都有完全相同的字段序列,相當于一個結(jié)構(gòu)化表的純文本形式。它比 Excel 文件更加簡潔,XLS 文本是電子表格,它包含了文本、數(shù)值、公式和格式等內(nèi)容,而 CSV 中不包含這些內(nèi)容,就是特定字符分隔的純文本,結(jié)構(gòu)簡單清晰。所以,有時候用 CSV 來保存數(shù)據(jù)是比較方便的。本節(jié)中,我們來講解 Python 讀取和寫入 CSV 文件的過程。

1. 寫入

這里先看一個最簡單的例子:

import csv
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

首先,打開 data.csv 文件,然后指定打開的模式為 w(即寫入),獲得文件句柄,隨后調(diào)用 csv 庫的 writer 方法初始化寫入對象,傳入該句柄,然后調(diào)用 writerow 方法傳入每行的數(shù)據(jù)即可完成寫入。

如果想修改列與列之間的分隔符,可以傳入 delimiter 參數(shù),其代碼如下:

import csv
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ')
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

2.多行寫入

調(diào)用 writerows 方法同時寫入多行,此時參數(shù)就需要為二維列表,例如:

import csv
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

3.字典寫入

用字典來表示。在 csv 庫中也提供了字典的寫入方式,示例如下:

import csv
with open('data.csv', 'w') as csvfile:
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
    writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
    writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

4. 爬蟲采集入庫

import httpx
res = httpx.get('https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1647605552864&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')
# 數(shù)據(jù)變字典格式
items = res.json()
item = items.get('Data')['Posts']  # 列表形式
data = []
for i in item:
    title =  i.get('RecruitPostName'),
    times =  i.get('LastUpdateTime'),
    data.append([title[0],times[0]])
import csv
with open('data2.csv', 'w',encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name'])
    writer.writerows(data)

3 關(guān)系型數(shù)據(jù)庫存儲

關(guān)系型數(shù)據(jù)庫是基于關(guān)系模型的數(shù)據(jù)庫,而關(guān)系模型是通過二維表來保存的,所以它的存儲方式就是行列組成的表,每一列是一個字段,每一行是一條記錄。表可以看作某個實體的集合,而實體之間存在聯(lián)系,這就需要表與表之間的關(guān)聯(lián)關(guān)系來體現(xiàn),如主鍵外鍵的關(guān)聯(lián)關(guān)系。多個表組成一個數(shù)據(jù)庫,也就是關(guān)系型數(shù)據(jù)庫。

關(guān)系型數(shù)據(jù)庫有多種,如 SQLite、MySQL、Oracle、SQL Server、DB2 等。

1. 準備工作

在開始之前,請確保已經(jīng)安裝好了 MySQL 數(shù)據(jù)庫并保證它能正常運行,而且需要安裝好 Py MySQL 庫。如果沒有安裝找班主任老師拿包

下載地址;https://dev.mysql.com/downloads/mysql/

安裝包:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.9-winx64.zip

參考地址:http://www.dbjr.com.cn/article/265139.htm

2. 連接數(shù)據(jù)庫

這里,首先嘗試連接一下數(shù)據(jù)庫。假設(shè)當前的 MySQL 運行在本地,用戶名為 root,密碼為 123456,運行端口為 3306。這里利用 PyMySQL 先連接 MySQL,然后創(chuàng)建一個新的數(shù)據(jù)庫,名字叫作 spiders,代碼如下:

import pymysql  
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)  
cursor = db.cursor()   # 游標
cursor.execute('SELECT VERSION()')  
data = cursor.fetchone()  
print('Database version:', data)  
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")  
db.close()

3. 創(chuàng)建數(shù)據(jù)表

import pymysql  
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)
db.close()

4. 插入數(shù)據(jù)

插入、更新和刪除操作都是對數(shù)據(jù)庫進行更改的操作,而更改操作都必須為一個事務(wù),所以這些操作的標準寫法就是:

import pymysql
id = '20220315'
user = '菲菲'
age = 20
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
# %s 動態(tài)傳參
sql = 'INSERT INTO students(id, name, age) values(% s, % s, % s)'
try:
    cursor.execute(sql, (id, user, age))
    db.commit()
except:
    db.rollback()
db.close()

5. 字典數(shù)據(jù)插入

data = {
    'id':'20220315',
    'name': '菲菲',
    'age': 20
}
keys = ', '.join(data.keys())
values = ', '.join(['% s'] * len(data))
sql = 'INSERT INTO students({keys}) VALUES ({values})'.format( keys=keys, values=values)
try:
   if cursor.execute(sql, tuple(data.values())):
       print('Successful')
       db.commit()
except:
    print('Failed')
    db.rollback()
db.close()

6. 爬蟲數(shù)據(jù)采集入庫

4 非關(guān)系型數(shù)據(jù)庫存儲

1. MongoDB簡介

MongoDB 是由 C++ 語言編寫的非關(guān)系型數(shù)據(jù)庫,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng),其內(nèi)容存儲形式類似 JSON 對象,它的字段值可以包含其他文檔、數(shù)組及文檔數(shù)組,非常靈活。在這一節(jié)中,我們就來看看 Python 3 下 MongoDB 的存儲操作。

安裝地址

參考:https://www.runoob.com/mongodb/mongodb-linux-install.html

2. 連接 MongoDB

連接 MongoDB 時,我們需要使用 PyMongo 庫里面的 MongoClient。一般來說,傳入 MongoDB 的 IP 及端口即可,其中第一個參數(shù)為地址 host,第二個參數(shù)為端口 port(如果不給它傳遞參數(shù),默認是 27017)

import pymongo
# 如果是云服務(wù)的數(shù)據(jù)庫   用公網(wǎng)IP連接
client = pymongo.MongoClient(host='localhost', port=27017)

3. 指定數(shù)據(jù)庫和表

db = client.test
collection = db['students']  # 都可以

4. 插入數(shù)據(jù)

插入數(shù)據(jù)。對于 students 這個集合,新建一條學(xué)生數(shù)據(jù),這條數(shù)據(jù)以字典形式表示:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
result = collection.insert(student)

4.1. 插入多條數(shù)據(jù)

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}
student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}
result = collection.insert([student1, student2])
print(result)

5. 爬蟲數(shù)據(jù)采集入庫

# encoding: utf-8
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db['students']  # 都可以
import httpx
def get_data():
    res = httpx.get('https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1647605552864&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')
    # 數(shù)據(jù)變字典格式
    items = res.json()
    item = items.get('Data')['Posts']  # 列表形式
    for i in item:
        if isinstance(i,dict):
            collection.insert_one(i)
get_data()

到此這篇關(guān)于Python中數(shù)據(jù)的多種存儲形式的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論