日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python5数据存储

發布時間:2023/12/20 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python5数据存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 txt文件存儲

  正常調用文件python文件操作

  https://www.cnblogs.com/x2x3/p/9979919.html

2 json文件存儲

  

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

  • 對象:它在JavaScript中是使用花括號{}包裹起來的內容,數據結構為{key1:value1, key2:value2, ...}的鍵值對結構。在面向對象的語言中,key為對象的屬性,value為對應的值。鍵名可以使用整數和字符串來表示。值的類型可以是任意類型。
  • 數組:數組在JavaScript中是方括號[]包裹起來的內容,數據結構為["java", "javascript", "vb", ...]的索引結構。在JavaScript中,數組是一種比較特殊的數據類型,它也可以像對象那樣使用鍵值對,但還是索引用得多。同樣,值的類型可以是任意類型。

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

  [{

? ? "name": "Bob",

? ? "gender": "male",

? ? "birthday": "1992-10-18"

}, {

? ? ?"name": "Selina",

? ? "gender": "female",

? ? "birthday": "1995-10-18"

}]

2 3 4 5 6 7 8 9 [{ ????"name":"Bob", ????"gender":"male", ????"birthday":"1992-10-18" },{ ???? "name":"Selina", ????"gender":"female", ????"birthday":"1995-10-18" }]

Python為我們提供了簡單易用的庫來實現JSON文件的讀寫操作,我們可以調用庫的loads()方法將JSON文本字符串轉為JSON對象,可以通過dumps()方法將JSON對象轉為文本字符串

值得注意的是,JSON的數據需要用雙引號來包圍,不能使用單引號。例如,若使用如下形式表示,則會出現錯誤

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)

?

另外,如果JSON中包含中文字符,會怎么樣呢?例如,我們將之前的JSON的部分值改為中文,再用之前的方法寫入到文本:

import json

data = [{
'name': '王偉',
'gender': '男',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))

json.dumps('中國你好')

'中國你好' 是ascii 字符碼,而不是真正的中文。

這是因為json.dumps 序列化時對中文默認使用的ascii編碼

想輸出真正的中文需要指定ensure_ascii=False

json.dumps中可以放置json字符串,但是也必須指定ensure_ascii=False


---------------------
作者:蠟筆小心丶
來源:CSDN
原文:https://blog.csdn.net/u011615787/article/details/73089523/
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

?

# -*- coding:utf-8 -*- import jsonstr = ''' [{"name": "木頭","gender": "馬尾","birthday": "1992-10-18" }, {"name": "Selina","gender": "female","birthday": "1995-10-18" }] ''' print(type(str)) data=json.loads(str) print(type(data)) # 另外,如果想保存JSON的格式,可以再加一個參數indent,代表縮進字符個數 str=json.dumps(data,indent=2,ensure_ascii=False) print(type(str)) with open('file.txt','w+',encoding='utf-8') as f:f.write(str)f.flush()f.seek(0)data=f.read()print(json.loads(data)) View Code

?

請千萬注意JSON字符串的表示需要用雙引號,否則loads()方法會解析失敗。

可以看到,中文字符都變成了Unicode字符,這并不是我們想要的結果。

被寫入的文件 中文顯示為Unicode字符

為了輸出中文,還需要指定參數ensure_ascii為False,另外還要規定文件輸出的編碼

可以發現,這樣就可以輸出JSON為中文了

?

3 csv文件存儲

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

用fieldnames表示,然后將其傳給DictWriter來初始化一個字典寫入對象,接著可以調用writeheader()方法先寫入頭信息,然后再調用writerow()方法傳入相應字典即可

#csv_write_test import csv with open('data.csv','w') as csvfile:writer=csv.writer(csvfile)writer.writerow(['id', 'name', 'age']) #寫入單行writer.writerow(['001','walker','18'])writer.writerows([['001','walker','18'],['001','walker','18']]) #寫入多行,參數為列表中包含列表 with open('data.csv','w') as csvfile:writer=csv.writer(csvfile,delimiter=' ') #delimiter 指定分隔符writer.writerow(['id', 'name', 'age'])writer.writerow(['001','walker','18'])#json 格式的csv存儲 with open('json.csv','w') as csvfile:#用fieldnames表示,然后將其傳給DictWriter來初始化一個字典寫入對象,# 接著可以調用writeheader()方法先寫入頭信息,然后再調用writerow()方法傳入相應字典即可。# 最終寫入的結果是完全相同的filenames=['id', 'name', 'age']writer=csv.DictWriter(csvfile,fieldnames=filenames,delimiter=',')#json依然可以傳入分隔符;也可以通過writerows寫入多行 writer.writeheader()writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})#讀取csv文件 with open('json.csv', 'r', encoding='utf-8') as csvfile:#這里我們構造的是Reader對象,通過遍歷輸出了每行的內容,每一行都是一個列表形式。# 注意,如果CSV文件中包含中文的話,還需要指定文件編碼reader = csv.reader(csvfile)for row in reader:print(row) #另一種讀取方法 import pandas as pd df = pd.read_csv('data.csv') print(df) View Code

?

mysql存儲

# -*- coding:utf-8 -*- import pymysql db = pymysql.connect(host='localhost',user='root', password='123456', port=3306) cursor = db.cursor() #在很多情況下,我們要達到的效果是插入方法無需改動,做成一個通用方法,只需要傳入一個動態變化的字典就好了。比如,構造這樣一個字典 #然后SQL語句會根據字典動態構造,元組也動態構造,這樣才能實現通用的插入方法。所以,這里我們需要改寫一下插入方法: data = {'id': '20120001','name': 'Bob','age': 20 } table = 'students' keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values) try:if cursor.execute(sql, tuple(data.values())):print('Successful')db.commit() except:print('Failed')db.rollback() db.close() #這里我們傳入的數據是字典,并將其定義為data變量。表名也定義成變量table。接下來,就需要構造一個動態的SQL語句了。# 首先,需要構造插入的字段id、name和age。這里只需要將data的鍵名拿過來,然后用逗號分隔即可。+所以 # ', '.join(data.keys())的結果就是id, name, age,然后需要構造多個%s當作占位符,有幾個字段構造幾個即可。比如, # 這里有三個字段,就需要構造%s, %s, %s。這里首先定義了長度為1的數組['%s'],然后用乘法將其擴充為['%s', '%s', '%s'], # 再調用join()方法,最終變 # INSERT INTO students(id, name, age) VALUES (%s, %s, %s) View Code

?

三 非關系型數據庫mongodb

NoSQL,全稱Not Only SQL,意為不僅僅是SQL,泛指非關系型數據庫。NoSQL是基于鍵值對的,而且不需要經過SQL層的解析,數據之間沒有耦合性,性能非常高

對于爬蟲的數據存儲來說,一條數據可能存在某些字段提取失敗而缺失的情況,而且數據可能隨時調整。另外,數據之間還存在嵌套關系。如果使用關系型數據庫存儲,一是需要提前建表,二是如果存在數據嵌套關系的話,需要進行序列化操作才可以存儲,這非常不方便。如果用了非關系型數據庫,就可以避免一些麻煩,更簡單高效。

  MongoDB是由C++語言編寫的非關系型數據庫,是一個基于分布式文件存儲的開源數據庫系統,其內容存儲形式類似JSON對象

連接mongodb

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

import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)

這樣就可以創建MongoDB的連接對象了。

?

另外,MongoClient的第一個參數host還可以直接傳入MongoDB的連接字符串,它以mongodb開頭,例如:

client = MongoClient('mongodb://localhost:27017/')

指定數據庫

MongoDB中可以建立多個數據庫,接下來我們需要指定操作哪個數據庫。這里我們以test數據庫為例來說明,下一步需要在程序中指定要使用的數據庫

?db = client.test

4. 指定集合

MongoDB的每個數據庫又包含許多集合(collection),它們類似于關系型數據庫中的表。

下一步需要指定要操作的集合,這里指定一個集合名稱為students。與指定數據庫類似,指定集合也有兩種方式

  collection = db.students

  collection = db['students']

5. 插入數據

在MongoDB中,每條數據其實都有一個_id屬性來唯一標識。如果沒有顯式指明該屬性,MongoDB會自動產生一個ObjectId類型的_id屬性。insert()方法會在執行后返回_id值

實際上,在PyMongo 3.x版本中,官方已經不推薦使用insert()方法了。當然,繼續使用也沒有什么問題。官方推薦使用insert_one()和insert_many()方法來分別插入單條記錄和多條記錄

student = {

????'id': '20170101', ????'name': 'Jordan', ????'age': 20, ????'gender': 'male' } result = collection.insert_one(student) print(result) print(result.inserted_id)

與insert()方法不同,這次返回的是InsertOneResult對象,我們可以調用其inserted_id屬性獲取_id。

對于insert_many()方法,我們可以將數據以列表形式傳遞

與insert()方法不同,這次返回的是InsertOneResult對象,我們可以調用其inserted_id屬性獲取_id。

對于insert_many()方法,我們可以將數據以列表形式傳遞,示例如下

student1 = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}

student2 = {
'id': '20170202',
'name': 'Mike',
'age': 21,
'gender': 'male'
}

result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)

該方法返回的類型是InsertManyResult,調用inserted_ids屬性可以獲取插入數據的_id列表

6. 查詢

find_one()或find()方法進行查詢,其中find_one()查詢得到的是單個結果,find()則返回一個生成器對象

result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)

對于多條數據的查詢,我們可以使用find()方法

results = collection.find({'age': 20})

print(results) for result in results: ????print(result)

表5-3 比較符號

符號

含義

示例

$lt

小于

{'age': {'$lt': 20}}

$gt

大于

{'age': {'$gt': 20}}

$lte

小于等于

{'age': {'$lte': 20}}

$gte

大于等于

{'age': {'$gte': 20}}

$ne

不等于

{'age': {'$ne': 20}}

$in

在范圍內

{'age': {'$in': [20, 23]}}

$nin

不在范圍內

{'age': {'$nin': [20, 23]}}

?

更高級查詢

表5-4 功能符號

符號

含義

示例

示例含義

$regex

匹配正則表達式

{'name': {'$regex': '^M.*'}}

name以M開頭

$exists

屬性是否存在

{'name': {'$exists': True}}

name屬性存在

$type

類型判斷

{'age': {'$type': 'int'}}

age的類型為int

$mod

數字模操作

{'age': {'$mod': [5, 0]}}

年齡模5余0

$text

文本查詢

{'$text': {'$search': 'Mike'}}

text類型的屬性中包含Mike字符串

$where

高級條件查詢

{'$where': 'obj.fans_count == obj.follows_count'}

自身

7. 計數

要統計查詢結果有多少條數據,可以調用count()方法

count = collection.find().count()
print(count)

?或者統計符合某個條件的數據:

count = collection.find({'age': 20}).count()
print(count)

8. 排序

排序時,直接調用sort()方法,并在其中傳入排序的字段及升降序標志即可。示例如下:

?

11

1 2 results = collection.find().sort('name', pymongo.ASCENDING) print([result['name'] for result in results])

?

運行結果如下:

?

1 ['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']

?

這里我們調用pymongo.ASCENDING指定升序。如果要降序排列,可以傳入pymongo.DESCENDING

11. 刪除

刪除操作比較簡單,直接調用remove()方法指定刪除的條件即可,此時符合條件的所有數據均會被刪

result = collection.remove({'name': 'Kevin'})
print(result)

另外,這里依然存在兩個新的推薦方法——delete_one()和delete_many()

result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

delete_one()即刪除第一條符合條件的數據,delete_many()即刪除所有符合條件的數據。它們的返回結果都是DeleteResult類型,可以調用deleted_count屬性獲取刪除的數據條數

?

三?

Redis存儲

Redis是一個基于內存的高效的鍵值型非關系型數據庫,存取效率極高,而且支持多種存儲數據結構,使用也非常簡單

在開始之前,請確保已經安裝好了Redis及RedisPy庫。如果要做數據導入/導出操作的話,還需要安裝RedisDump。如果沒有安裝

https://cuiqingcai.com/5587.html

轉載于:https://www.cnblogs.com/x2x3/p/10923757.html

總結

以上是生活随笔為你收集整理的python5数据存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。