方便且實用,Python內置的輕量級資料庫實操

2021-02-21 Crossin的編程教室

之前我們在很多項目案例中都使用了MySQL資料庫。有的同學問:MySQL安裝和配置太麻煩了,老是搞不定,有沒有更簡便的方法?

當然有咯!

Python內置的sqlite3模塊就是一個輕量級的資料庫,不需要獨立的伺服器進程。它的資料庫就是一個.db後綴的文件,可以跨平臺直接訪問,非常便捷。簡直就是輕量級數據的首選資料庫啊!

今天我們就來用Python實戰操作一下sqlite3,通過本案例可以完全掌握sqlite3的常用操作。

本文主要內容:

資料庫操作:包括數據的查詢、刪除、導出等操作,最後上一個自動化導出的案例。

不過,在開始前需要說明的是,雖然Python內置了sqlite3模塊,但它只是用來連接資料庫的接口。你仍然需要確保電腦上已經有了sqlite3這個資料庫軟體。

如果你是Mac或者Linux系統,那麼恭喜你,你的電腦上默認就裝有sqlite3。Windows的同學得手動安裝一下。

下載地址:https://www.sqlite.org/download.html

選擇 Precompiled Binaries for Windows,下載預編譯的二進位 zip 文件:sqlite-tools-win32-*.zip 和 sqlite-dll-win32-*.zip。

在你的電腦上創建文件夾 C:\sqlite,並在此文件夾下解壓上面兩個壓縮文件,將得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。

添加 C:\sqlitePATH 環境變量。安裝成功後,在命令提示符下,使用 sqlite3 命令,將會顯示如下結果:

C:\>sqlite3SQLite version 3.7.15.2 2013-01-09 11:53:05Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite>

1. 讀取數據並插入資料庫

本文以TXT文件為例,進行示範操作。TXT文件為單列數據,以換行符分割,文件數量60+,數據總量5萬+。

程序設計思路:自動讀取每個TXT文件,再依次讀取每一行並插入資料庫中。

1.1 原始碼
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 17 15:06:42 2020

@author: liulu

"""
import sqlite3
import os
path = os.getcwd()
files = os.listdir(path)

conn = sqlite3.connect(path+'\db.db')
cur = conn.cursor()

cur.execute('create table if not exists numbers (id integer primary key ,number varchar(20) NOT NULL)')
conn.commit()

i = 0
for file in files:
if file.split('.')[-1] == 'txt':
with open(file,'r',encoding = 'UTF-8') as f:
next(f)
for line in f:
i += 1
print("插入第", i, "條數據:")
#print(line)
cur.execute('insert into numbers values(?,?)',(i,line))
conn.commit()
cur.close()
conn.close()
print('數據寫入完成!共寫入',i,' 條數據')

1.2 運行效果代碼運行效果圖1.3 重點代碼解釋

1)自動獲取所有TXT文件名稱和路徑

了解我的讀者都知道,我是比較懶的,我不喜歡指定程序的路徑。我寫的程序都是自己找路徑,自己找文件名稱。感興趣的朋友可以去我的公眾號(智能演示)查看這篇文章:獲取任意路徑下文件名稱的2種方法。

2)資料庫的創建與連接

conn = sqlite3.connect(path+'\db.db')

path是程序所在路徑,也是TXT文件的所在路徑。這行代碼的意思是:如果資料庫已經存在,則連接資料庫;如果資料庫不存在,則先創建資料庫,再連接該資料庫。

3)創建表

cur.execute('create table if not exists numbers (id integer primary key ,number varchar(20) NOT NULL)')

在資料庫db.db 中創建表numbers,表中包含兩個欄位:id、number。

注意!一定不要忘了conn.commit()保存一下!不然後面的數據是插不進去的。

4)插入數據

①優化打開方式

with open(file,'r',encoding = 'UTF-8') as f:

建議使用 with 語句來打開TXT文件。這樣做的好處是,當對象會在with語句結束時會自動關閉。效率更高!不易出錯。

②佔位符功能

cur.execute('insert into numbers values(?,?)',(i,line))

(?,?) 起到佔位符功能,(i,line))中的值會按位置替換到SQL語句中。

這樣就實現了數據的自動插入資料庫。需要幾分鐘時間,請耐心等待。

我們查看下db.db文件屬性,可以看到存儲了51216條數據的資料庫文件大小只有1.13MB,可以說是很輕量的。你可以將這個資料庫文件複製到任意一臺電腦上,連接上資料庫即可進行操作,非常方便。

下面就來說一下sqlite3的常用操作。

2. 資料庫操作2.1 連接資料庫
import sqlite3
import os
path = os.getcwd()
files = os.listdir(path)
conn = sqlite3.connect(path+'\db.db')
cur = conn.cursor()

這樣就連接上了剛才的資料庫。path+'\db.db'是資料庫的路徑及文件名,你可以手動輸入路徑,也可以將.py文件和db.db資料庫文件放在同一目錄下,系統自動計算路徑,這是懶人方法。

2.2 查詢資料庫中有哪些表

我們似乎不知道db.db這個資料庫中有什麼,如何才能知道這個資料庫中有哪些表呢?

cur.execute("SELECT name FROM sqlite_master WHERE type='table';")
Tables=cur.fetchall()
print(Tables)
# [('numbers',)]

2.3 刪除資料庫中的某個表

如果需要刪除資料庫中的某個表,可以執行以下命令:

cur.execute("drop table tablename;")

2.4 查詢某個表的結構
cur.execute("PRAGMA table_info(numbers)")
print(cur.fetchall())
# [(0, 'id', 'integer', 0, None, 1), (1, 'number', 'varchar(20)', 1, None, 0)]

2.5 查詢表中前50條記錄
cur.execute("SELECT * from numbers limit 0,50;")
conn.commit
data = cur.fetchall()
print(data)

2.6 查詢表中所有記錄
# 5.查詢表中所有記錄
cur.execute("SELECT * from numbers;")
data_all = cur.fetchall()
a = len(data_all)
print('共有 '+ str(a) + ' 條記錄')
#print(data)

2.7 查詢表中不重複記錄
cur.execute("SELECT distinct number from numbers;")
data_distinct = cur.fetchall()
b = len(data_distinct)
print('共有 '+ str(b) +' 條不重複記錄')
#print(data_distinct)

2.8 將老表中的不重複記錄插入新表
# 創建一個新表
cur.execute('create table if not exists numbers_distinct (id integer primary key ,number varchar(20) NOT NULL)')
conn.commit()
# 插入數據
i = 0
for data in data_distinct:
i += 1
data = data[0]
#print(data)
cur.execute('insert into numbers_distinct values(?,?)',(i,data))
conn.commit()

2.9 將特定結果寫入文本文件(單列)
cur.execute("SELECT number from numbers_distinct limit 0,10;")
datas = cur.fetchall()
#print(datas)
with open('datafile1.txt','w') as f1:
for data in datas:
f1.write(data[0])
f1.flush()

注意:f1.flush()操作很重要!將緩衝區的數據寫入文件中,否則文本文件為空白,導致寫入失敗。

2.10 將特定結果寫入文本文件(多列)
cur.execute("SELECT * from numbers_distinct limit 0,10;")
datas = cur.fetchall()
#print(datas)
with open('datafile2.txt','w') as f2:
for data in datas:
data0 = str(data[0]) # 將int類型轉為str,否則write函數報錯
data = data0 + ' ' + data[1] # 在兩列之間以Tab鍵分隔
f2.write(data)
f2.flush()

2.11 將特定結果寫入CSV文件(多列)

寫入CSV文件和寫入文本文件的方法基本相同,只需要將文件後綴改為 '.csv',並將分隔符改為英文狀態下逗號即可。

with open('datafile3.csv','w') as f3:
for data in datas:
data0 = str(data[0]) # 將int類型轉為str,否則write函數報錯
data = data0 + ',' + data[1] # 在兩列之間以逗號鍵分隔
f3.write(data) # data是元組類型
f3.flush() # 重要!將緩衝區的數據寫入文件中

2.12 辦公自動化案例

本文以:將number_distingct表中的數據,以每50個為一組,分別存入一個文本文件為例,演示以下Python結合sqlite3資料庫的辦公自動化的驚豔效果。

1)原始碼

"""
原始碼已發布到【智能演示】微信公眾號,後臺回復 sqlite3 可獲取下載連結。
"""
for n in range(int(b/50)+1):
if 50*n+50 < b: # b為數據記錄總數
cur.execute('SELECT number from numbers_distinct limit ?,?',(50*n,50))
datas = cur.fetchall()
#print(datas)
filename = str(50*n) + '-' + str(50*n+50) + '.txt'
print('正在寫入:' + filename)
with open(filename,'w') as f4:
for data in datas:
f4.write(data[0]) # data是元組類型
f4.flush() # 重要!將緩衝區的數據寫入文件中
else:
filename = str(50*n) + '-' + str(b) + '.txt'
print('正在寫入:' + filename)
with open(filename,'w') as f5: # 計算最後一個文本文件名稱
cur.execute('SELECT number from numbers_distinct limit ?,?',(50*n+50,50))
datas = cur.fetchall()
for data in datas:
f5.write(data[0]) # data是元組類型
f5.flush() # 重要!將緩衝區的數據寫入文件中
print('寫入完成!共寫入{}個TXT文件。'.format(n+1))

2)運行效果

導出719個TXT文件,幾秒鐘就完成了。

3)重點代碼解釋

這個案例的重點是如何計算出每個TXT文件的名稱。

我們可以計算出numbers_distinct表中共有35926條數據。

我們可以構建這樣一個函數:filename = str(50*n) + '-' + str(50*n+50) + '.txt',用來計算每個導出的TXT文件名稱。

但是最後一個文件的名稱不能通過這個方法來構建,需要作以下簡單的修改:filename = str(50*n) + '-' + str(b) + '.txt'

計算好每個TXT文件名稱後,直接用write函數寫入就可以了。

快來動動手試一下吧!

相關焦點

  • 隱藏彩蛋:你知道python有一個內置的資料庫嗎?
    圖源:unsplash如果你是軟體開發人員,相信你一定知道甚至曾經使用過一個非常輕量級的資料庫——SQLite。它幾乎擁有作為一個關係資料庫所需的所有功能,而且這些有功能都保存在一個文件中。· 實驗性SQL語言擴展最重要的是,SQLite實際上是作為Python的內置庫,換言之,你不需要安裝任何伺服器端/客戶端軟體,也不需要讓某個東西作為服務運行,只要你用Python導入庫並開始編碼,就會有一個關係資料庫管理系統!
  • LocalDB:微軟的新生代輕量級資料庫
    導讀:LocalDB是SQL Server 2012帶來的新特性,它是一個專門為開發人員量身定製的輕量級資料庫。本文將為您講解LocalDB的開發背景,展示其核心特性,並看看它與微軟的其它輕量級資料庫到底有何不同。
  • Python內置庫SQlite3使用指南
    實際上是作為Python庫內置的。換言之,你不需要安裝任何伺服器端/客戶端軟體,也不需要運行某個服務,只要你在Python中導入庫並開始編程,那麼你就有了一個關係資料庫管理系統!導入和使用這裡我們說「內置」的意思就是,你甚至不需要運行 pip install ,就能獲取庫。只需要通過以下方式導入:1.創建與資料庫的連接我們根本不需要為驅動程序、連接字符串等煩惱。
  • 3個既簡單又強大的Python Web 框架
    Django是一個高級別的PythonWeb框架,它鼓勵快速開發和乾淨、實用的設計。它是由經驗豐富的開發人員構建的,它處理了Web開發中的許多麻煩,因此您可以專注於編寫應用程式,而無需重新發明方向盤。它是免費的,開源的。Django的設計是為了幫助開發人員儘快將應用程式從概念到完成。Django非常重視安全性,並幫助開發人員避免許多常見的安全錯誤。
  • 我的實戰經驗分享:深入淺出Python資料庫操作
    的感嘆~看過我圖文的朋友大概會了解,是比較傾向於「授之以漁」的,本篇也一樣,除了說說關鍵點外,會給很多資料傳送門,明確方向方便大伙兒深入了解。咱話不多說,直接進入主題吧!在實操之前,我們稍微先提一下環境配置什麼的。
  • python內置函數format的使用方法
    前言其實在Java中,我們已經解除過format的使用,例如:當我們要把昨天的訂單金額統計後顯示到前臺時,由於資料庫存儲的是double格式的數據,在統計完昨天的訂單金額後仍然是double類型的數據,但是,之前遇到過此類問題的小夥伴都知道,這個訂單額有時候會喪失精度,變成一個很長的
  • Python Web 開發哪家強?
    它的開發基於「內置電池的方法」(譯者註:Django 自帶全套工具,可以開箱即用),使開發人員無需第三方庫和工具即可創建網站。隨著 2005 年 7 月 15 日的第一次發布, Django 由 Django 軟體基金會(DSF)開發和管理。它是免費且開源的,已經發布了許多個版本。Flask
  • 為什麼說python內置函數並不是萬能的?
    在分析為什麼 list() 會更慢的時候,文中說到它需要經過名稱查找與函數調用兩個步驟,那麼,這就引出了一個新的問題:list() 不是內置類型麼,為什麼它不能直接就調用創建列表的邏輯呢?也就是說,為什麼解釋器必須經過名稱查找,才能「認識」到該做什麼呢?其實原因很簡單:內置函數/內置類型的名稱並不是關鍵字,它們只是解釋器內置的一種便捷功能,方便開發者開箱即用而已。
  • 每天一分鐘,python一點通(Python 連接資料庫mysql)
    mysql資料庫每天一分鐘,python一點通(workbench new table),且建立了一個資料庫表,該如何操作資料庫?  Python 連接資料庫mysql  在操作mysql資料庫前,請先安裝pymysql(pip install pymysql)  import pymysql.cursorsMYSQL_HOSTS='localhost' # 本地資料庫,若是伺服器上的資料庫,請輸入伺服器IPMYSQL_USER
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    3、我現在系統需要一個功能,當一個任務到達某個狀態時,如果24小時沒有任何人操作,則自動切換到另一個狀態,對每個用戶是有不同的任務的,有點想百度外賣下單等待商家接單的那種,有什麼可以方便django整合一起的框架嗎?django-celery如何?簡單說一下我的考慮,供你參考。用戶下單後,用戶訂單信息寫入資料庫。商家接單後,修改資料庫中用戶訂單狀態。
  • Python數據科學實踐 | 資料庫1
    假如用excel文件,店名必須要輸入N遍(試想一下有20~30個優惠券活動,那麼店名就得重複輸入至少20次),這非常不方便,而且也不利於數據結構的查看。如果使用excel進行數據管理,會十分消耗計算機性能,且大大降低了運行效率。這時候,就需要使用SQL來進行數據維護了。在明白為什麼要使用SQL後,就可以回答為什麼需要SQLAlchemy了。編寫原生的SQL語句學習成本比較高,如果能有工具可以實現直接用Python語法寫SQL語句的話,豈不美哉!
  • python爬取+BI分析5000條內衣數據,發現妹子最愛這款文胸
    於是,我就想到用一種更簡單的方式進行數據分析,那就是python爬取+BI分析,python強大的數據獲取能力,配合輕量級BI簡單快捷的可視化操作,分析效果奇佳。原理也很簡單,數據層由Python來進行抓取到網頁數據,解析後儲存到mysql資料庫;BI負責最後應用層的數據處理、加工和可視化。
  • 【Python-資料庫】Numpy資料庫
    Numpy是一個內置的數學資料庫,很多知識應該是涉及到高數的,但是無奈很多我已經不記得了。只能介紹一些我了解的了。
  • Python常用庫大全
    資料庫Python實現的資料庫。pickleDB – 一個簡單,輕量級鍵值儲存資料庫。 PipelineDB – 流式 SQL 資料庫。 TinyDB – 一個微型的,面向文檔型資料庫。MySQL – awesome-mysql系列 mysql-python – Python 的 MySQL 資料庫連接器。 mysqlclient – mysql-python 分支,支持 Python 3。
  • Python內置函數一覽表
    內置函數是解釋器的一部分,它隨著解釋器的啟動而生效;標準庫函數是解釋器的外部擴展,導入模塊以後才能生效。一般來說,內置函數的執行效率要高於標準庫函數。Python 解釋器一旦啟動,所有的內置函數都生效了;而導入標準庫的某個模塊,只是該模塊下的函數生效,並不是所有的標準庫函數都生效。
  • Python 操作MySQL資料庫
    Python 使用操作MySQL第一步:安裝mysql資料庫並創建號表安裝python即pycharm環境。mysqlclient-1.3.12-cp36-cp36m-win_amd64.whl安裝命令:pipinstall mysqlclient-1.3.12-cp36-cp36m-win_amd64.whl 第三步:python
  • python對mysql資料庫的操作(一)
    本文章介紹python對mysql資料庫的基本操作,以及編寫一個模擬用戶的註冊。
  • Python爬蟲學習的完整路線推薦
    大數據時代,網際網路成為大量信息的載體,機械的複製粘貼不再實用,不僅耗時費力還極易出錯,這時爬蟲的出現解放了大家的雙手,以其高速爬行、定向抓取資源的能力獲得了大家的青睞。爬蟲變得越來越流行,不僅因為它能夠快速爬取海量的數據,更因為有python這樣簡單易用的語言使得爬蟲能夠快速上手。
  • Python 內置函數總結(2/4)
    上次一鼓氣碼了一二十個內置, 乘熱打鐵, 2/4如下:小編寫的是自己的理解,肯定不是最詳細的tips: 如果基本的掌握了
  • python必備入門軟體
    第一步:下載Anaconda軟體Anaconda則是一個打包的集,裡面預裝好了conda、python、眾多packages、科學計算工具等等,所以也稱為Python的一種發行版。支持Linux、Mac、Windwos系統,可以很方便地解決多版本python並存、切換以及各種第三方包安裝問題。