如何用Python檢查SQLite數(shù)據(jù)庫(kù)中表是否存在
1. 引言:為何需要檢查表是否存在?
1.1 SQLite 簡(jiǎn)介
SQLite 是一個(gè)輕量級(jí)、文件化的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它不需要獨(dú)立的服務(wù)器進(jìn)程,可以直接在應(yīng)用程序中嵌入使用。這使得它成為桌面應(yīng)用、移動(dòng)應(yīng)用和小型網(wǎng)站的理想選擇。Python 的標(biāo)準(zhǔn)庫(kù)內(nèi)置了 sqlite3 模塊,提供了與 SQLite 數(shù)據(jù)庫(kù)交互的完整接口。
1.2 檢查表存在性的場(chǎng)景
在進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),我們經(jīng)常需要判斷某個(gè)表是否已經(jīng)存在。常見的場(chǎng)景包括:
- “創(chuàng)建表如果不存在”邏輯:在程序首次運(yùn)行時(shí),檢查核心表是否存在,如果不存在則創(chuàng)建,以確保數(shù)據(jù)庫(kù)結(jié)構(gòu)的完整性。
- 避免重復(fù)操作:防止在已知表已存在的情況下再次嘗試創(chuàng)建表,從而導(dǎo)致錯(cuò)誤。
- 動(dòng)態(tài)數(shù)據(jù)庫(kù)管理:在開發(fā)或管理工具中,根據(jù)用戶輸入或配置來(lái)判斷特定表的存在性。
- 版本升級(jí):在數(shù)據(jù)庫(kù)架構(gòu)升級(jí)時(shí),檢查舊版本中特定表的結(jié)構(gòu),以便進(jìn)行遷移。
2. Python 與 SQLite:基礎(chǔ)連接
在使用 Python 與 SQLite 交互之前,我們需要了解如何建立和關(guān)閉數(shù)據(jù)庫(kù)連接。
2.1sqlite3模塊
sqlite3 模塊是 Python 標(biāo)準(zhǔn)庫(kù)的一部分,無(wú)需額外安裝。
2.2 建立與關(guān)閉連接
import sqlite3
import os
DB_FILE = "my_database.db"
def connect_db():
"""建立數(shù)據(jù)庫(kù)連接"""
try:
conn = sqlite3.connect(DB_FILE)
return conn
except sqlite3.Error as e:
print(f"連接數(shù)據(jù)庫(kù)失敗: {e}")
return None
def close_db(conn):
"""關(guān)閉數(shù)據(jù)庫(kù)連接"""
if conn:
conn.close()
# 示例:創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)和表
def setup_test_db():
if os.path.exists(DB_FILE):
os.remove(DB_FILE) # 清理舊的測(cè)試文件
conn = connect_db()
if conn:
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
);
''')
conn.commit()
print(f"數(shù)據(jù)庫(kù) '{DB_FILE}' 已創(chuàng)建,并創(chuàng)建了 'users' 表。")
close_db(conn)
def cleanup_test_db():
"""刪除測(cè)試數(shù)據(jù)庫(kù)文件"""
if os.path.exists(DB_FILE):
os.remove(DB_FILE)
print(f"數(shù)據(jù)庫(kù) '{DB_FILE}' 已刪除。")
# setup_test_db() # 調(diào)用以創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)
# cleanup_test_db() # 調(diào)用以刪除測(cè)試數(shù)據(jù)庫(kù)
3. 方法一:查詢sqlite_master表(推薦)
這是檢查 SQLite 中表是否存在的最標(biāo)準(zhǔn)、最推薦的方法。
3.1sqlite_master表簡(jiǎn)介
sqlite_master 是 SQLite 數(shù)據(jù)庫(kù)中的一個(gè)特殊內(nèi)部表,它存儲(chǔ)了數(shù)據(jù)庫(kù)的所有元數(shù)據(jù)(schema information)。這個(gè)表包含了所有表、索引、視圖和觸發(fā)器的定義信息。sqlite_master 表的結(jié)構(gòu)通常包含以下列:
type: 對(duì)象類型(‘table’, ‘index’, ‘view’, ‘trigger’)name: 對(duì)象名稱tbl_name: 表名(對(duì)于表本身,此列與name相同)rootpage: 根頁(yè)編號(hào)sql: 創(chuàng)建對(duì)象的 SQL 語(yǔ)句
3.2 SQL 查詢語(yǔ)句
要檢查一個(gè)表是否存在,我們可以查詢 sqlite_master 表,過(guò)濾 type 為 'table' 且 name 與目標(biāo)表名匹配的記錄。
SELECT name FROM sqlite_master WHERE type='table' AND name='{table_name}';
如果查詢返回結(jié)果(即一行數(shù)據(jù)),則表示該表存在;如果未返回任何結(jié)果,則表示該表不存在。
3.3 Python 代碼實(shí)現(xiàn)
def check_table_exists_sqlite_master(db_file, table_name):
"""
方法一:通過(guò)查詢 sqlite_master 表來(lái)檢查表是否存在。
這是最推薦和最安全的方法,因?yàn)樗褂脜?shù)化查詢來(lái)處理表名。
"""
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
# 使用參數(shù)化查詢,防止 SQL 注入
query = "SELECT name FROM sqlite_master WHERE type='table' AND name=?;"
cursor.execute(query, (table_name,)) # 注意 table_name 是元組
result = cursor.fetchone()
return result is not None
except sqlite3.Error as e:
print(f"檢查表 '{table_name}' 存在性時(shí)發(fā)生 SQLite 錯(cuò)誤: {e}")
return False
finally:
if conn:
conn.close()
3.4 優(yōu)點(diǎn)與考慮
- 優(yōu)點(diǎn):
- 語(yǔ)義清晰:直接查詢數(shù)據(jù)庫(kù)的元數(shù)據(jù),明確表達(dá)意圖。
- 安全性高:支持參數(shù)化查詢
name=?,能夠有效防止 SQL 注入(因?yàn)?table_name被視為數(shù)據(jù),而不是 SQL 結(jié)構(gòu)的一部分)。 - 效率高:查詢
sqlite_master表通常比嘗試對(duì)一個(gè)可能不存在的表進(jìn)行操作更高效。 - 標(biāo)準(zhǔn) SQL:這是通用的 SQL 標(biāo)準(zhǔn)方法,易于理解。
- 考慮:SQLite 默認(rèn)對(duì)表名是大小寫不敏感的,除非在創(chuàng)建表時(shí)使用了雙引號(hào)將表名括起來(lái)(例如
CREATE TABLE "Users")。如果你創(chuàng)建表時(shí)沒(méi)有使用引號(hào),那么查詢users和USERS都會(huì)找到同一個(gè)表。如果需要精確區(qū)分大小寫,你可能需要更復(fù)雜的邏輯或確保表名一致性。
4. 方法二:使用PRAGMA table_info()
PRAGMA 語(yǔ)句是 SQLite 特有的、用于控制和查詢數(shù)據(jù)庫(kù)內(nèi)部狀態(tài)的非標(biāo)準(zhǔn) SQL 命令。
4.1PRAGMA table_info()簡(jiǎn)介
PRAGMA table_info('table_name') 語(yǔ)句會(huì)返回指定表的所有列信息。如果表不存在,它會(huì)返回一個(gè)空的結(jié)果集。
4.2 Python 代碼實(shí)現(xiàn)
def check_table_exists_pragma_table_info(db_file, table_name):
"""
方法二:通過(guò) PRAGMA table_info() 檢查表是否存在。
此方法對(duì)表名使用字符串格式化,因此需要謹(jǐn)慎處理用戶輸入。
"""
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
# 注意:PRAGMA 語(yǔ)句通常不支持對(duì)表名進(jìn)行參數(shù)化查詢,
# 因此這里使用 f-string 格式化。如果 table_name 來(lái)自用戶輸入,
# 則存在 SQL 注入風(fēng)險(xiǎn),需要額外的驗(yàn)證或白名單機(jī)制。
cursor.execute(f"PRAGMA table_info('{table_name}');")
result = cursor.fetchall()
return len(result) > 0 # 如果有列信息返回,則表存在
except sqlite3.Error as e:
print(f"檢查表 '{table_name}' 存在性時(shí)發(fā)生 SQLite 錯(cuò)誤: {e}")
return False
finally:
if conn:
conn.close()
4.3 優(yōu)點(diǎn)與風(fēng)險(xiǎn)
- 優(yōu)點(diǎn):
- 簡(jiǎn)潔:代碼相對(duì)簡(jiǎn)潔。
- 效率較高:直接查詢表結(jié)構(gòu)。
- 風(fēng)險(xiǎn):
- SQL 注入風(fēng)險(xiǎn):
PRAGMA語(yǔ)句通常不支持對(duì)表名進(jìn)行參數(shù)化查詢。這意味著,如果table_name參數(shù)是由用戶提供且未經(jīng)嚴(yán)格驗(yàn)證,惡意用戶可以通過(guò)構(gòu)造table_name來(lái)執(zhí)行任意 SQL 代碼。因此,此方法不適合處理來(lái)自不可信源的動(dòng)態(tài)表名。 - 非標(biāo)準(zhǔn) SQL:
PRAGMA語(yǔ)句是 SQLite 特有的,不具備跨數(shù)據(jù)庫(kù)的通用性。
- SQL 注入風(fēng)險(xiǎn):
5. 方法三:嘗試查詢表并捕獲異常
這種方法利用了數(shù)據(jù)庫(kù)在嘗試訪問(wèn)不存在的表時(shí)會(huì)拋出異常的特性。
5.1 原理說(shuō)明
我們嘗試對(duì)目標(biāo)表執(zhí)行一個(gè)簡(jiǎn)單的查詢操作(例如 SELECT 1 FROM table_name LIMIT 1),如果該表不存在,sqlite3 模塊會(huì)拋出 sqlite3.OperationalError 異常。我們可以捕獲這個(gè)異常來(lái)判斷表是否存在。
5.2 Python 代碼實(shí)現(xiàn)
def check_table_exists_try_select(db_file, table_name):
"""
方法三:嘗試從表中查詢數(shù)據(jù)并捕獲 OperationalError 異常。
此方法使用異常處理進(jìn)行流程控制,且對(duì)表名使用字符串格式化。
"""
conn = None
try:
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
# 同樣,表名作為 SQL 結(jié)構(gòu)的一部分,這里使用 f-string 格式化。
# 存在 SQL 注入風(fēng)險(xiǎn),需要額外的驗(yàn)證。
cursor.execute(f"SELECT 1 FROM {table_name} LIMIT 1;")
return True # 如果執(zhí)行成功,則表存在
except sqlite3.OperationalError:
return False # 捕獲到 OperationalError,說(shuō)明表不存在
except sqlite3.Error as e:
print(f"檢查表 '{table_name}' 存在性時(shí)發(fā)生意外的 SQLite 錯(cuò)誤: {e}")
return False
finally:
if conn:
conn.close()
5.3 優(yōu)點(diǎn)與缺點(diǎn)
- 優(yōu)點(diǎn):
- 直觀:某種程度上比較直觀地模擬了“嘗試訪問(wèn)”。
- 缺點(diǎn):
- SQL 注入風(fēng)險(xiǎn):與方法二類似,由于表名作為 SQL 結(jié)構(gòu)的一部分,無(wú)法進(jìn)行參數(shù)化查詢,因此存在 SQL 注入風(fēng)險(xiǎn)。
- 性能開銷:異常處理通常比條件判斷有更高的性能開銷,尤其是在表不存在的情況成為常態(tài)時(shí)。
- 異常處理作為流程控制:將異常用于正常的邏輯流程控制通常被認(rèn)為是不良實(shí)踐,降低代碼的可讀性和維護(hù)性。
- 其他
OperationalError:除了表不存在,其他操作性錯(cuò)誤(如權(quán)限問(wèn)題、表?yè)p壞)也可能導(dǎo)致OperationalError,這可能使判斷不準(zhǔn)確。
6. 最佳實(shí)踐與注意事項(xiàng)
6.1 使用with語(yǔ)句管理連接
Python 的 sqlite3 連接對(duì)象支持上下文管理器協(xié)議,可以使用 with 語(yǔ)句來(lái)自動(dòng)處理連接的打開和關(guān)閉,即使發(fā)生錯(cuò)誤也能確保資源被釋放。
def check_table_exists_with_context(db_file, table_name):
"""使用 with 語(yǔ)句管理連接,并使用推薦的 sqlite_master 方法。"""
try:
with sqlite3.connect(db_file) as conn: # 連接將自動(dòng)關(guān)閉
cursor = conn.cursor()
query = "SELECT name FROM sqlite_master WHERE type='table' AND name=?;"
cursor.execute(query, (table_name,))
result = cursor.fetchone()
return result is not None
except sqlite3.Error as e:
print(f"檢查表 '{table_name}' 存在性時(shí)發(fā)生 SQLite 錯(cuò)誤: {e}")
return False
6.2 SQL 注入防護(hù)
- 對(duì)于 sqlite_master 方法:由于
name是查詢條件中的數(shù)據(jù)值,可以使用參數(shù)化查詢 (name=?),這是最安全的方式。 - 對(duì)于 PRAGMA table_info() 和 嘗試查詢 方法:表名是 SQL 語(yǔ)句結(jié)構(gòu)的一部分,不能直接用
?進(jìn)行參數(shù)化。如果table_name來(lái)自用戶輸入,你必須:- 嚴(yán)格驗(yàn)證:確保
table_name只包含字母、數(shù)字和下劃線,不包含任何特殊字符。 - 使用白名單:只允許
table_name是預(yù)定義的一個(gè)允許的表名列表中的成員。 - 避免使用:如果無(wú)法確保安全性,最好避免使用這兩種方法來(lái)處理動(dòng)態(tài)表名。
- 嚴(yán)格驗(yàn)證:確保
6.3 錯(cuò)誤處理
始終使用 try-except sqlite3.Error 來(lái)捕獲可能發(fā)生的數(shù)據(jù)庫(kù)錯(cuò)誤,并進(jìn)行適當(dāng)?shù)奶幚?,而不是讓程序崩潰?/p>
6.4 表名大小寫敏感性
SQLite 默認(rèn)情況下對(duì)表名和列名是大小寫不敏感的,除非在 CREATE TABLE 語(yǔ)句中使用了雙引號(hào) " 將名稱括起來(lái)。
- 例如,
CREATE TABLE users和CREATE TABLE USERS會(huì)創(chuàng)建同一個(gè)表,并且SELECT name FROM sqlite_master WHERE name='users'和WHERE name='USERS'都能找到它。 - 但
CREATE TABLE "Users"會(huì)創(chuàng)建一個(gè)大小寫敏感的表,此時(shí)WHERE name='Users'才能找到它,而WHERE name='users'則不能。
在大多數(shù)應(yīng)用中,通常建議使用小寫表名且不加引號(hào),以保持一致性和避免大小寫問(wèn)題。
7. 綜合代碼示例
import sqlite3
import os
DB_FILE = "my_database.db"
def setup_database_for_testing():
"""
創(chuàng)建測(cè)試數(shù)據(jù)庫(kù),包含一個(gè) 'users' 表和一個(gè)大小寫敏感的 '"Products"' 表,
以及一個(gè)不存在的 'orders' 表。
"""
if os.path.exists(DB_FILE):
os.remove(DB_FILE)
try:
with sqlite3.connect(DB_FILE) as conn:
cursor = conn.cursor()
# 創(chuàng)建一個(gè)普通表 (大小寫不敏感)
cursor.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
''')
# 創(chuàng)建一個(gè)大小寫敏感的表 (注意雙引號(hào))
cursor.execute('''
CREATE TABLE "Products" (
item_id INTEGER PRIMARY KEY,
item_name TEXT NOT NULL
);
''')
conn.commit()
print(f"測(cè)試數(shù)據(jù)庫(kù) '{DB_FILE}' 已創(chuàng)建,包含 'users' 和 'Products' 表。")
except sqlite3.Error as e:
print(f"Error setting up test database: {e}")
def cleanup_database_after_testing():
"""刪除測(cè)試數(shù)據(jù)庫(kù)文件。"""
if os.path.exists(DB_FILE):
os.remove(DB_FILE)
print(f"測(cè)試數(shù)據(jù)庫(kù) '{DB_FILE}' 已刪除。")
def check_table_exists_master_method(table_name):
"""方法一:查詢 sqlite_master 表(推薦)。"""
try:
with sqlite3.connect(DB_FILE) as conn:
cursor = conn.cursor()
query = "SELECT name FROM sqlite_master WHERE type='table' AND name=?;"
cursor.execute(query, (table_name,))
return cursor.fetchone() is not None
except sqlite3.Error as e:
print(f"SQLite error for '{table_name}' with master method: {e}")
return False
def check_table_exists_pragma_method(table_name):
"""方法二:使用 PRAGMA table_info()(注意 SQL 注入風(fēng)險(xiǎn))。"""
try:
with sqlite3.connect(DB_FILE) as conn:
cursor = conn.cursor()
# !! SQL 注入風(fēng)險(xiǎn):表名未經(jīng)參數(shù)化,來(lái)自用戶輸入時(shí)需嚴(yán)格驗(yàn)證 !!
cursor.execute(f"PRAGMA table_info('{table_name}');")
return len(cursor.fetchall()) > 0
except sqlite3.Error as e:
print(f"SQLite error for '{table_name}' with pragma method: {e}")
return False
def check_table_exists_try_select_method(table_name):
"""方法三:嘗試查詢并捕獲異常(注意 SQL 注入風(fēng)險(xiǎn)和流程控制)。"""
try:
with sqlite3.connect(DB_FILE) as conn:
cursor = conn.cursor()
# !! SQL 注入風(fēng)險(xiǎn):表名未經(jīng)參數(shù)化,來(lái)自用戶輸入時(shí)需嚴(yán)格驗(yàn)證 !!
cursor.execute(f"SELECT 1 FROM {table_name} LIMIT 1;")
return True
except sqlite3.OperationalError:
return False
except sqlite3.Error as e:
print(f"SQLite error for '{table_name}' with try-select method: {e}")
return False
def main():
setup_database_for_testing()
print("\n--- 檢查 'users' 表 (存在,大小寫不敏感) ---")
print(f"sqlite_master: {check_table_exists_master_method('users')}")
print(f"PRAGMA: {check_table_exists_pragma_method('users')}")
print(f"try-select: {check_table_exists_try_select_method('users')}")
print(f"sqlite_master (大寫): {check_table_exists_master_method('USERS')}") # SQLite 默認(rèn)不區(qū)分大小寫
print(f"PRAGMA (大寫): {check_table_exists_pragma_method('USERS')}")
print(f"try-select (大寫): {check_table_exists_try_select_method('USERS')}")
print("\n--- 檢查 'Products' 表 (存在,大小寫敏感) ---")
print(f"sqlite_master: {check_table_exists_master_method('Products')}")
print(f"PRAGMA: {check_table_exists_pragma_method('Products')}")
print(f"try-select: {check_table_exists_try_select_method('Products')}")
print(f"sqlite_master (小寫): {check_table_exists_master_method('products')}") # 應(yīng)該為 False
print(f"PRAGMA (小寫): {check_table_exists_pragma_method('products')}")
print(f"try-select (小寫): {check_table_exists_try_select_method('products')}")
print("\n--- 檢查 'orders' 表 (不存在) ---")
print(f"sqlite_master: {check_table_exists_master_method('orders')}")
print(f"PRAGMA: {check_table_exists_pragma_method('orders')}")
print(f"try-select: {check_table_exists_try_select_method('orders')}")
cleanup_database_after_testing()
if __name__ == "__main__":
main()
8. 總結(jié)與方法對(duì)比
| 方法 | 優(yōu)點(diǎn) | 缺點(diǎn) | 推薦指數(shù) |
|---|---|---|---|
| sqlite_master | 最安全 (參數(shù)化查詢),語(yǔ)義清晰,效率高,標(biāo)準(zhǔn)SQL。 | 對(duì)于大小寫敏感的表名需要精確匹配。 | ????? |
| PRAGMA table_info() | 簡(jiǎn)潔,效率尚可。 | SQL 注入風(fēng)險(xiǎn) (表名無(wú)法參數(shù)化),非標(biāo)準(zhǔn)SQL。 | ?? |
| 嘗試查詢 + 異常捕獲 | 直觀。 | SQL 注入風(fēng)險(xiǎn) (表名無(wú)法參數(shù)化),性能開銷,異常處理作為流程控制 (不良實(shí)踐)。 | ? |
總結(jié):
我強(qiáng)烈建議您在 Python 中檢查 SQLite 表是否存在時(shí),優(yōu)先使用查詢 sqlite_master 表的方法。這種方法不僅具有最高的安全性(通過(guò)參數(shù)化查詢防止 SQL 注入),而且語(yǔ)義清晰,效率高,是處理這類數(shù)據(jù)庫(kù)操作的最佳實(shí)踐。
對(duì)于 PRAGMA table_info() 和“嘗試查詢 + 異常捕獲”這兩種方法,由于它們存在 SQL 注入風(fēng)險(xiǎn)(因?yàn)楸砻麩o(wú)法進(jìn)行參數(shù)化),并且在性能和代碼風(fēng)格上有所劣勢(shì),因此應(yīng)盡量避免使用,尤其是在表名可能來(lái)自不可信來(lái)源的情況下。
請(qǐng)始終記住,在與數(shù)據(jù)庫(kù)交互時(shí),安全性、清晰性和資源管理是至關(guān)重要的。
到此這篇關(guān)于如何用Python檢查SQLite數(shù)據(jù)庫(kù)中表是否存在的文章就介紹到這了,更多相關(guān)Python檢查SQLite表是否存在內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)現(xiàn)將sqlite數(shù)據(jù)庫(kù)導(dǎo)出轉(zhuǎn)成Excel(xls)表的方法
- Python獲取SQLite查詢結(jié)果表列名的方法
- python 獲取sqlite3數(shù)據(jù)庫(kù)的表名和表字段名的實(shí)例
- python查詢sqlite數(shù)據(jù)表的方法
- python實(shí)現(xiàn)在sqlite動(dòng)態(tài)創(chuàng)建表的方法
- Python_查看sqlite3表結(jié)構(gòu),查詢語(yǔ)句的示例代碼
- python?peewee操作sqlite鎖表的問(wèn)題分析
相關(guān)文章
python 實(shí)現(xiàn)循環(huán)定義、賦值多個(gè)變量的操作
這篇文章主要介紹了python 實(shí)現(xiàn)循環(huán)定義、賦值多個(gè)變量的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python selenium爬取微博數(shù)據(jù)代碼實(shí)例
這篇文章主要介紹了Python selenium爬取微博數(shù)據(jù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python解析Excle文件中的數(shù)據(jù)方法
今天小編就為大家分享一篇Python解析Excle文件中的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
如何在Python中引入和使用瀏覽器驅(qū)動(dòng)
本文介紹了如何在Python中引入和使用瀏覽器驅(qū)動(dòng),主要步驟包括安裝Selenium庫(kù)、下載并配置瀏覽器驅(qū)動(dòng)路徑、編寫Python代碼啟動(dòng)瀏覽器以及結(jié)束操作后關(guān)閉瀏覽器2025-01-01
Python調(diào)試神器之PySnooper的使用教程分享
對(duì)于每個(gè)程序開發(fā)者來(lái)說(shuō),調(diào)試幾乎是必備技能。本文小編就來(lái)給大家介紹一款非常好用的調(diào)試工具,它能在一些場(chǎng)景下,大幅度提高調(diào)試的效率, 那就是 PySnooper,希望大家喜歡2023-02-02
pycharm中下載的包但是import還是無(wú)法使用/報(bào)紅的解決方法
用pycharm開發(fā)時(shí),在導(dǎo)入自己寫的python文件時(shí)出現(xiàn)模塊名爆紅的情況,下面這篇文章主要給大家介紹了關(guān)于pycharm中下載包但是import還是無(wú)法使用/報(bào)紅的解決方法,需要的朋友可以參考下2023-02-02
Python使用Opencv打開筆記本電腦攝像頭報(bào)錯(cuò)解問(wèn)題及解決
這篇文章主要介紹了Python使用Opencv打開筆記本電腦攝像頭報(bào)錯(cuò)解問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Python的信號(hào)庫(kù)Blinker用法詳解
在本篇文章里小編給大家整理了一篇關(guān)于Python的信號(hào)庫(kù)Blinker用法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-12-12

