Python爬虫-数据处理与存储
Python爬蟲-數據處理與存儲
數據處理
? 可以使用pandas模塊來實現數據處理,pandas是一個開源的并且通過BSD許可的庫。它主要為Python語言提供高性能、易于使用數據結構和數據分析工具,此外還提供了多種數據操作和數據處理方法。由于pandas是第三方模塊所以在使用前需要安裝并導入該模塊。
pandas 數據結構
? pandas的數據結構中有兩大核心,分別是Series與DataFrame。 其中Series是一維數組,它與Python中基本數據結構List相近。Series可以保存多種數據類型的數據,如布爾值、字符串、數字類型等。DataFrame是一種表格形式的數據結構,類似于Excel表格,是一種二維的表格型數據結構。
1.Series對象
§ 創建Series對象
在創建Series對象時,只需要將數組形式的數據傳入Series()構造函數中即可。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 7:30 PM # 文件 :Series對象.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建數據數組 data = ['A', 'B', 'C']# 創建Series對象 series = pd.Series(data) # 輸出Series對象內容 print(series)程序運行結果如下:
0 A 1 B 2 C dtype: objectProcess finished with exit code 0說 明
在上述程序的運行結果中,左側數字列為索引列,右側字母列為索引對應的元素。Series對象在沒有指定索引時,將默認生成從0開始依次遞增的索引值。
? § 在創建Series對象時,是可以指定索引名稱的,例如指定索引項為a、b、c。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 7:48 PM # 文件 :指定索引的Series對象.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index ) # 輸出指定索引的Series對象內容 print(series)程序運行結果如下:
a A b B c C dtype: objectProcess finished with exit code 0§ 訪問數據
在訪問Series對象中的數據時,可以單獨訪問索引數組或者元素數組。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 7:52 PM # 文件 :訪問數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index ) # 輸出索引數組 print('索引數組為:', series.index) # 打印元素數組 print('元素數組為:', series.values)程序運行結果為:
索引數組為: Index(['a', 'b', 'c'], dtype='object') 元素數組為: ['A' 'B' 'C']Process finished with exit code 0當需要獲取指定下標的數組元素時,可以直接通過“Series對象[下標]“的方式進行數組元素的獲取,數組下標從0開始。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 7:57 PM # 文件 :獲取指定下標的數組元素.py # IDE :PyCharmimport pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index ) # 輸出指定下標的數組元素 print('指定下標的數組元素為:', series[1]) # 輸出指定索引的數組元素 print('指定索引的數組元素為:', series['a'])程序運行結果如下:
指定下標的數組元素為: B 指定索引的數組元素為: AProcess finished with exit code 0當需要獲取多個下標對應的Series對象時,可以指定下標范圍,示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 8:03 PM # 文件 :指定下標范圍獲取數據.py # IDE :PyCharmimport pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index) # 輸出下標為0,1,2對應的Series對象 print('獲取多個下標對應的Series對象:') print(series[0:3])程序運行結果如下:
獲取多個下標對應的Series對象: a A b B c C dtype: objectProcess finished with exit code? 除了通過指定下標范圍的方式獲取Series對象之外,還可以通過指定多個索引的方式獲取Series對象。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 8:13 PM # 文件 :指定多個索引方式獲取Series對象.py # IDE :PyCharmimport pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index) # 輸出索引a、b對應的Series對象 print('獲取多個索引對應的Series對象:') print(series[['a', 'b']])程序運行結果如下:
獲取多個索引對應的Series對象: a A b B dtype: objectProcess finished with exit code 0§ 修改元素值
修改Series對象的元素值時,同樣可以通過指定下標或者指定索引的方式來實現。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 8:19 PM # 文件 :修改Series對象的元素值.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建數據數組 data = ['A', 'B', 'C'] # 創建索引名稱的數組 index = ['a', 'b', 'c']# 創建指定索引的Series對象 series = pd.Series(data, index=index )# 修改下標為0的元素值 series[0] = 'D' print('修改下標為0的元素值:\n') print(series)# 修改索引為b的原素值 series['b'] = 'A' print('修改索引為b的元素值:') # 打印修改元素值以后的Series對象 print(series)程序運行結果如為:
修改下標為0的元素值:a D b B c C dtype: object 修改索引為b的元素值: a D b A c C dtype: objectProcess finished with exit code 02. DataFrame對象
? 在創建DataFrame對象時,需要通過字典來實現。其中每列的名稱為鍵,而每個鍵對應的是一個數組,這個數組作為值。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 10:09 PM # 文件 :DataFrame對象.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 0 1 6 11 1 2 7 12 2 3 8 13 3 4 9 14 4 5 10 15Process finished with exit code 0說 明
上面運行結果中看到,左側單獨的數字(0-4)為索引列,在沒有指定特定的索引時,DataFrame對象默認的索引將從0開始遞增。右側A、B、C列名為鍵,列名對應的值為數組。
? DataFrame對象同樣可以單獨指定索引名稱,指定方式與Series對象類似,示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 10:29 PM # 文件 :單獨指定索引名稱.py # IDE :PyCharmimport pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 自定義索引 index = ['a', 'b', 'c', 'd', 'e']# 創建自定義索引DataFrame對象 data_frame = pd.DataFrame(data, index = index) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C a 1 6 11 b 2 7 12 c 3 8 13 d 4 9 14 e 5 10 15Process finished with exit code 0如果數據中含有不需要的數據列時,可以在創建DataFrame對象時指定需要的數據列名。示例代碼如如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 10:33 PM # 文件 :指定需要的數據列名.py # IDE :PyCharmimport pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]}# 創建指定列名的DataFrame對象 data_frame = pd.DataFrame(data, columns=['B', 'C']) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
B C 0 6 11 1 7 12 2 8 13 3 9 14 4 10 15Process finished with exit code 0數據的增、刪、改、查
1. 增添數據
當為DataFrame對象添加一列數據時,可以先創建列名,然后為其賦值數據。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 10:39 PM # 文件 :增添數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data)# 增加D列數據 data_frame['D'] = [10, 20, 30, 40, 50] # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C D 0 1 6 11 10 1 2 7 12 20 2 3 8 13 30 3 4 9 14 40 4 5 10 15 50Process finished with exit code 02. 刪除數據
? pandas 模塊中提供了drop()函數,用于刪除DataFrame對象中的某行或某列數據,該函數提供了多個參數,其中比較常用的參數及含義如下表所示:
? drop()函數常用參數及含義
| labels | 需要刪除的行或列的名稱,接收string或array |
| axis | 默認為0,表示刪除行,當axis = 1時表示刪除列 |
| index | 指定需要刪除的行 |
| columns | 指定需要刪除的列 |
| inplace | 設置為False表示不改變原數據,返回一個執行刪除后的新DataFrame對象;設置為True將對原數據進行刪除操作 |
? 實現刪除DataFrame對象原數據中指定列與索引的行數據。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 10:48 PM # 文件 :刪除數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 刪除原數據中索引為0的那行數據 data_frame.drop([0], inplace=True) # 刪除原數據中列名為A的那列數據 data_frame.drop(labels='A', axis=1, inplace=True) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
B C 1 7 12 2 8 13 3 9 14 4 10 15Process finished with exit code 0補 充
在實現刪除DataFrame對象中指定列名的數據時,也可以通過del關鍵字來實現,例如刪除原來數據中列名為A的數據,可以用del data_frame[‘A’]代碼
drop()函數除了可以刪除指定的列或者行數據以外,還可以通過指定行索引的范圍,實現刪除多行數據的功能。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:01 PM # 文件 :刪除多行數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data)# 刪除原數據中行索引從0至2的前三行數據 data_frame.drop(labels=range(0, 3), axis=0, inplace=True) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 3 4 9 14 4 5 10 15Process finished with exit code 03. 修改數據
當需要修改DataFrame對象中某一列的某個元素時,可以通過賦值的方式來進行元素的修改。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:12 PM # 文件 :修改數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 將A列中第三行數據修改為10 data_frame['A'][2] = 10# 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 0 1 6 11 1 2 7 12 2 10 8 13 3 4 9 14 4 5 10 15Process finished with exit code 0在修改DataFrame對象中某一列的所有數據時,需要了解當前修改列名所對應的元素數組中包含的元素個數,然后根據原有元素的個數進行對應元素的修改。代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:21 PM # 文件 :修改某一列的所有數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 將B列中所有的數據修改 data_frame['B'] = [5, 4, 3, 2, 1]# 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 0 1 5 11 1 2 4 12 2 3 3 13 3 4 2 14 4 5 1 15Process finished with exit code 0注 意
當修改B列中的所有數據且修改的元素數量與原有的元素數了不匹配時,將報錯。
說 明
將某一列賦值為單個元素時,例如,data_frame[‘B’] = 1, 此時B列所對應的數據將都被修改為1
data_frame['B'] = 1結果如下:
A B C 0 1 1 11 1 2 1 12 2 3 1 13 3 4 1 14 4 5 1 15Process finished with exit code 04.查詢數據
在獲取DataFrame對象中某一列數據時,可以通過直接指定列名或者直接調用列名屬性的方式來獲取指定列的數據。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:34 PM # 文件 :查詢數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data)print('指定列名的數據為:\n', data_frame['A']) print('指定列名屬性的數據為:\n', data_frame.B)程序運行結果如下:
指定列名的數據為:0 1 1 2 2 3 3 4 4 5 Name: A, dtype: int64 指定列名屬性的數據為:0 6 1 7 2 8 3 9 4 10 Name: B, dtype: int64Process finished with exit code 0在獲取DataFrame對象從第1行至第3行范圍內的數據時,可以通過指定索引范圍的方式來獲取數據,行索引從0開始,行索引0對應的是DataFrame對象中的第1行數據。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:39 PM # 文件 :獲取指定行索引范圍的數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data)print('指定行索引范圍的數據:\n', data_frame[0:3])程序運行結果如下:
指定行索引范圍的數據:A B C 0 1 6 11 1 2 7 12 2 3 8 13Process finished with exit code 0說 明
在獲取指定行索引范圍的示例代碼中,0為起始行索引,3為結束行索引的位置,所以此次獲取內容并不包含行索引為3的數據。
在獲取DataFrame對象中某一列的某個元素時,可以通過依次指定列名稱、行索引的方式來進行數據的獲取。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/13/22 11:44 PM # 文件 :獲取某列的某個元素.py # IDE :PyCharm# 導入pandas模塊 import pandas as pddata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data)print('獲取指定列中的某個數據:\n', data_frame['B'][2])程序運行結果如下:
獲取指定列中的某個數據:8Process finished with exit code 0NaN數據處理
1.修改元素為NaN
? NaN數據在numpy模塊中表示空缺數據,所以在數據分析中偶爾會需要將數據結構中的某個元素修改為NaN值,這時只需要調用numpy.NaN,為需要修改的元素賦值即可實現修改元素的目的。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:14 AM # 文件 :修改元素為NaN.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd, numpydata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) #將數據中列名為A,行索引為0的元素修改為NaN data_frame['A'][0] = numpy.nan# 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 0 NaN 6 11 1 2.0 7 12 2 3.0 8 13 3 4.0 9 14 4 5.0 10 15Process finished with exit code 02.統計NaN數據
? pandas模塊提供了兩個可以快速識別空缺值的方法,isnull()方法用于判斷數值是否為空缺值,如果是空缺值將返回True。notnull()方法用于識別非空缺值,該方法在檢測出不是空缺值的數據時將返回True。通過這兩個方法與統計函數sum()方法即可獲取數據中空缺值與非空缺值的具體數量。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:32 AM # 文件 :統計NaN數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd, numpydata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) #將數據中列名為A,行索引為0的元素修改為NaN data_frame['A'][0] = numpy.nan# 打印數據中空缺值數量 print('每列空缺值數量為:\n', data_frame.isnull().sum())# 打印數據中非空缺值數量 print('每列非空缺值數量為:\n', data_frame.notnull().sum())程序運行結果如下:
每列空缺值數量為:A 1 B 0 C 0 dtype: int64 每列非空缺值數量為:A 4 B 5 C 5 dtype: int64Process finished with exit code 03. 篩選NaN元素
? 在實現NaN元素的篩選時,可以使用dropna()函數,例如,將包含NaN元素所在的整行數據刪除。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:38 AM # 文件 :篩選NaN元素.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd, numpydata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) #將數據中列名為A,行索引為0的元素修改為NaN data_frame['A'][0] = numpy.nan# 將包含NaN元素的整行數據刪除 data_frame.dropna(axis=0, inplace=True)# 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
A B C 1 2.0 7 12 2 3.0 8 13 3 4.0 9 14 4 5.0 10 15Process finished with exit code 0說 明
如果需要將數據中包含NaN元素所在的整列數據刪除,可以將axis參數設置為1
dropna()函數提供了一個how參數,如果將該參數設置為all, dropna()函數將會刪除某行或者是某列所有元素全部為NaN的值。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:49 AM # 文件 :dropna()函數how參數應用.py # IDE :PyCharm#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:14 AM # 文件 :修改元素為NaN.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd, numpydata = {'A':[1, 2, 3, 4, 5],'B':[6, 7, 8, 9, 10],'C':[11, 12, 13, 14, 15]} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 將數據中列名為A,行索引為0的元素修改為NaN data_frame['A'][0] = numpy.nan # 將數據中列名為A,行索引為1的元素修改為NaN data_frame['A'][1] = numpy.nan # 將數據中列名為A,行索引為2的元素修改為NaN data_frame['A'][2] = numpy.nan # 將數據中列名為A,行索引為3的元素修改為NaN data_frame['A'][3] = numpy.nan # 將數據中列名為A,行索引為4的元素修改為NaN data_frame['A'][4] = numpy.nan# 刪除包含NaN元素對應的整行數據 data_frame.dropna(how='all', axis=1,inplace=True) # 輸出DataFrame對象內容 print(data_frame)程序運行結果如下:
B C 0 6 11 1 7 12 2 8 13 3 9 14 4 10 15Process finished with exit code 0說 明
因為axis的默認值0,所以只對行數據進行刪除,而所有元素都為NaN的是列,所以在指定how參數時還需要指定刪除目標列axis=1
4. NaN元素的替換
? 當處理數據中的NaN元素時,為了避免刪除數據中比較重要的參考數據。可以使用fillna()函數將數據中NaN元素替換為同一個元素,這樣在進行數據分析時,可以很清楚地知道哪些元素無用(即為NaN元素)。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 9:53 AM # 文件 :NaN元素的替換.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd data = {'A':[1, None, 3, 4, 5],'B':[6, 7, 8, None, 10],'C':[11, 12, None, 14, None]}# 創建DataFrame對象 data_frame = pd.DataFrame(data) # 輸出修改前的數據 print('修改前的數據:\n', data_frame) # 將數據中所有NaN元素修改為0 data_frame.fillna(0, inplace=True) # 輸出修改后的數據 print('修改后代數據:\n', data_frame)程序運行結果如下:
修改前的數據:A B C 0 1.0 6.0 11.0 1 NaN 7.0 12.0 2 3.0 8.0 NaN 3 4.0 NaN 14.0 4 5.0 10.0 NaN 修改后代數據:A B C 0 1.0 6.0 11.0 1 0.0 7.0 12.0 2 3.0 8.0 0.0 3 4.0 0.0 14.0 4 5.0 10.0 0.0Process finished with exit code 0去除重復數據
? pandas模塊提供的drop_duplicates()方法用于去除指定列中的重復數據。語法格式如下:
pandas.dataFrame.drop_duplicates(subset=None, keep='first', inplace=False)? drop_duplicates()方法的常用參數及含義如下表:
? drop_duplicates()方法中常用的參數及含義
| subset | 表示指定需要去重的列名,也可以是多個列名組成的列表。默認None,表示全部列 |
| keep | 表示保存重復數據的哪一條數據,first表示保留第一條、last表示保留最后一條、False表示重復項數據都不留。默認first |
| inplace | 表示是否在原數據中進行操作,默認為False |
? 在指定去除某一列中重復數據時,需要在subset參數位置指定列名。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 11:00 AM # 文件 :drop_duplicate()方法出去指定列中的重復數據.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd # 創建數據 data = {'A':['A1','A1','A3'],'B':['B1','B2','B1']} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 指定列名為A data_frame.drop_duplicates('A', inplace=True) # 打印移除后的數據 print(data_frame)程序運行結果如下:
A B 0 A1 B1 2 A3 B1Process finished with exit code 0注 意
在去除DataFrame對象中的重復數據時,將會刪除指定列中重復數據所對應整行數據。
說 明
drop_duplicates()方法除了刪除DataFrame對象中的數據行以外,還可以對DataFrame對象中的某一列數據進行重復數據的刪除。例如,刪除DataFrame對象中A列內重復數據,可使用此行代碼:new_data = data_frame[‘A’].drop_duplicates()
drop_duplicates()方法不僅可以實現DataFrame對象中單列的去重復操作,還可以實現多列的去重操作。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 12:00 PM # 文件 :drop_duplicates()方法實現DataFrame對象多列去重操作.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd # 創建數據 data = {'A':['A1', 'A1', 'A1', 'A2', 'A2'],'B':['B1', 'B1', 'B3', 'B4', 'B5'],'C':['C1', 'C2', 'C3', 'C4', 'C5']} # 創建DataFrame對象 data_frame = pd.DataFrame(data) # 進行多列去重操作 data_frame.drop_duplicates(subset=['A', 'B'], inplace=True) # 輸出移除后的數據 print(data_frame)程序運行結果如下:
A B C 0 A1 B1 C1 2 A1 B3 C3 3 A2 B4 C4 4 A2 B5 C5Process finished with exit code 0文件的存取
基本文件操作TXT
1. TXT文件存儲
如果想要簡單地進行TXT文件存儲工作,可以通過open()函數操作文件實現,即需要先創建或者打開指定的文件并創建文件對象。open()函數的基本語法格式如下:
file = open(filename[, mode[,buffering]])參數說明
? § file:被創建的文件對象
? § filename:要創建或打開文件的文件名稱,需要使用單引號或雙引號將其括起來。如果要打開的文件和當前文件在同一目錄下,那么直接寫文件名即可,否則需要指定完整路徑。例如,要打開當前路徑下的名稱為status.txt的文件,可以使用"status.txt"。
? § mode:可選參數,用于指定文件的打開模式。其參數如下表。默認的打開模式為只讀(即r)
? mode參數的參數值說明
| r | 以只讀模式打開文件。文件的指針將會放在文件的開頭 | 文件必須存在 |
| rb | 以二進制格式打開文件,并且采用只讀模式。文件的指針將會放在文件的開頭,一般用于非文本文件,如圖片、聲音等 | 文件必須存在 |
| r+ | 打開文件后,可以讀取文件內容,也可以寫入新的內容覆蓋原有內容(從文件開頭進行覆蓋) | 文件必須存在 |
| rb+ | 以二進制格式打開文件,并且采用讀寫模式,文件的指針將會放在文件的開頭,一般用于非文本文件、如圖片、聲音等 | 文件必須存在 |
| w | 以只寫模式打開文件 | 文件存在,則將其覆蓋,否則創建新文件 |
| wb | 以二進制格式打開文件,并且采用只寫模式。一般用于非文本文件,如圖片、聲音等 | 文件存在,則將其覆蓋,否則創建新文件 |
| w+ | 打開文件后,先清空原有內容,使其變為一個空的文件,對這個空文件有讀寫權限 | 文件存在,則將其覆蓋,否則創建新文件 |
| wb+ | 以二進制格式打開文件,并且采用讀寫模式。一般用于非文本文件,如圖片、聲音等 | 文件存在,則將其覆蓋,否則創建新文件 |
| a | 以追加模式打開一個文件。如果該文件已經存在,文件指針將放在文件的末尾(即新內容會被寫入到已有內容之后),否則,創建新文件用于寫入 | |
| ab | 以二進制格式打開文件,并且采用追加模式。如果該文件已經存在,文件指針將放在文件的末尾(即新內容會被寫入已有內容之后),否則,創建新文件用于寫入 | |
| a+ | 以讀寫模式打開文件。如果該文件已經存在,文件指針將放在文件的末尾(即新內容會被寫入到已有內容之后),否則,創建新文件用于讀寫 | |
| ab+ | 以二進制格式打開文件,并且采用追加模式。如果該文件已經存在,文件指針將放在文件的末尾(即新內容會被寫入到已有內容之后),否則,創建新文件用于讀寫 |
§ buffering:可選參數,用于指定讀寫文件的緩沖模式,值為0表達式不緩存;值為1表示緩存;值大于1,則表示緩沖區的大小。默認為緩存模式。
? 以爬取某網頁中的勵志名句為例,首先通過requests發送網絡請求,然后接收響應結果并通過BeautifulSoup解析HTML代碼,接著提取所有信息,最后將信息逐條寫入data.txt文件當中。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 1:06 PM # 文件 :TXT文件存儲.py # IDE :PyCharm# 導入網絡請求模塊 import requests # 導入etree子模塊 from lxml import etree# 定義請求頭 headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36" } for i in range(2):# 定義請求地址url = f'http://quotes.toscrape.com/tag/inspirational/page/{i+1}/'# 發送網絡請求resp = requests.get(url, headers=headers)# 如果網絡請求成功if resp.status_code == 200:# 解析html文件html = etree.HTML(resp.text)# 獲取當前頁的所有顯示的勵志名句的span標簽text_all = html.xpath('//span[@class="text"]')# 創建open對象txt_file = open('data.txt', 'a', encoding='utf-8')# 循環遍歷爬取內容for i1, value in enumerate(text_all):# 寫入爬取的每條勵志名句并在結尾換行txt_file.write(str(i1)+value.text+'\n')txt_file.close()運行以上示例代碼后,當前目錄中將自動生成data.txt文件,打開文件如下圖所示:
2. 讀取TXT文件
在Python中打開TXT文件后,除了可以向其寫入或追加內容,還可以讀取文件中的內容。讀取文件內容主要是分為以下幾種情況。
? § 讀取指定字符
? 文件對象提供了read()方法用于讀取指定個數的字符。其語法格式如下:
file.read([size])? 其中,file為打開的文件對象;size為可選參數,用于指定要讀取的字符個數,如果省略則一次性讀取所有內容。讀取上例中的data.txt文件中的示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 2:27 PM # 文件 :讀取data.txt文件中的前46個字符.py # IDE :PyCharm# 打開文件 with open('data.txt', 'r') as f:# 讀取前50個字符string = f.read(46)print(string)執行結果如下:
0. “There are only two ways to live your life.Process finished with exit code 0使用read()方法讀取文件時,是從文件的開頭讀取的。如果想要讀取部分內容,可以先使用文件對象的seek()方法將文件的指針移動到新的位置,然后再應用read()方法讀取。seek()方法的基本語法格式如下:
file.seek(offset[,where])參數說明:
-
file:表示已經打開的文件對象
-
offset:用于指定移動的字符個數,其具體位置與whence有關
-
whence:用于指定從什么位置開始計算。值為0表示從文件頭開始計算;1 表示從當前位置開始計算;2 表示從文件尾開始計算,默認為0
想要從文件的第49個字符開始讀取38個字符,示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 2:56 PM # 文件 :從文件的指定字符開始讀取特定個數的字符.py # IDE :PyCharm# 打開文件 with open('data.txt', 'r') as f:# 移動到文件指針到新到位置f.seek(49)string = f.read(38)print(string)上面的程序執行結果如如下:
One is as though nothing is a miracle.Process finished with exit code 0說 明
使用seek()方法時,如果采用GBK編碼,那么offset的值是按一個漢字(包括中文標點符號)占兩個字符計算,而采用UTF-8編碼,則一個漢字占3個字符,不過無論采用何種編碼英文和數字都按一個字符計算的。這與read()方法不同。
§ 讀取一行
? 在使用read()方法讀取文件時,如果文件很大,一次讀取全部內容到內存容易造成內存不足,所以通常會采用逐行讀取。文件對象提供了readline()方法用于每次讀取一行數據。readline()方法基本語法格式如下:
file.readline()? 其中,file為打開的文件對象。同read()方法一樣,打開文件時,也需要指定打開模式為r(只讀)或者r+(讀寫)。逐行讀取Python經典應用文件,示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 3:27 PM # 文件 :逐行讀取Python經典應用文件.py # IDE :PyCharmprint("\n","="*20,"Python經典應用","="*20,"\n") with open('message.txt','r') as file: # 打開保存Python經典應用信息的文件number = 0 # 記錄行號while True:number += 1line = file.readline()if line =='':break # 跳出循環print(number,line,end= "\n") # 輸出一行內容 print("\n","="*20,"over","="*20,"\n")程序運行結果如下:
==================== Python經典應用 ==================== 1 1 Zope :應用服務器2 2 Plone :內容管里系統3 3 Django :鼓勵快速開發的Web應用框架4 4 Python Wikipedia Robot Framework:MediaWiki的機器人程序5 5 tornado :非阻塞式服務器6 6 Reddit :社交分享網站7 7 Dropbox :文件分享服務8 8 Trac :使用Python編寫的BUG管里系統9 9 Blender :以C與Python開發的開源3D繪圖軟件==================== over ==================== Process finished with exit code 0§ 讀取全部行
? 讀取全部行的作用同調用readd()方法時不指定size類似,只不過讀取全部行時,返回的是一個字符串列表,每個元素為文件的一行內容。讀取全部行,使用的是文件對象的**readlines()**方法,其語法格式如下:
file.readlines()? 其中,file為打開的文件對象。同read()方法一樣,打開文件時,也需要指定打開模式為r(只讀)或者r+(讀寫),通過readlines()方法讀取message.txt文件中的所有內容,并輸出讀取結果,代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 4:13 PM # 文件 :通過readlines()方法讀取全部內容.py # IDE :PyCharmprint("\n","="*20,"Python經典應用","="*20,"\n") with open('message.txt','r') as file: # 打開保存Python經典應用信息的文件message = file.readlines() # 讀取全部信息print(message) # 輸出信息print("\n","="*25,"over","="*25,"\n")程序運行結果如下:
==================== Python經典應用 ==================== ['1 Zope :應用服務器\n', '2 Plone :內容管里系統\n', '3 Django :鼓勵快速開發的Web應用框架\n', '4 Python Wikipedia Robot Framework:MediaWiki的機器人程序\n', '5 tornado :非阻塞式服務器\n', '6 Reddit :社交分享網站\n', '7 Dropbox :文件分享服務\n', '8 Trac :使用Python編寫的BUG管里系統\n', '9 Blender :以C與Python開發的開源3D繪圖軟件']========================= over =========================? 從該運行結果中可以看出readlines()方法的返回值為一個字符串列表。在這個字符串列表中,每個元素記錄一行內容。如果文件比較大時,采用這種方法輸出讀取的文件內容會很慢。這時可以將列表的內容逐行輸出。代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 4:26 PM # 文件 :deadlines()方法逐行輸出內容.py # IDE :PyCharmprint("\n","="*20,"Python經典應用","="*20,"\n") with open('message.txt','r') as file: # 打開保存Python經典應用信息的文件messageall = file.readlines() # 讀取全部信息for message in messageall:print(message) # 輸出信息 print("\n","="*25,"over","="*25,"\n")程序運行結果如下:
==================== Python經典應用 ==================== 1 Zope :應用服務器2 Plone :內容管里系統3 Django :鼓勵快速開發的Web應用框架4 Python Wikipedia Robot Framework:MediaWiki的機器人程序5 tornado :非阻塞式服務器6 Reddit :社交分享網站7 Dropbox :文件分享服務8 Trac :使用Python編寫的BUG管里系統9 Blender :以C與Python開發的開源3D繪圖軟件========================= over ========================= Process finished with exit code 0存取CSV文件
? CSV文件是文本文件的一種,該文件中每一行數據的各元素使用逗號進行分隔。其實存取CSV文件時同樣可以使用open()函數,不過還可以使用更好的辦法,那就是使用pandas模塊實現CSV文件的存取。
1.CSV文件的存儲
Pandas提供了to_csv()函數用于實現CSV文件的存儲,該函數中常用的參數及含義如下表:
? to_csv()函數常用參數及含義
| filepath_or_buffer | 表示文件路徑的字符串 |
| sep | str類型,表示分隔符,默認為逗號“,” |
| na_rep | str類型,用于替換缺失值,默認為“”空 |
| float_format | str類型,指定浮點數據的格式,例如,’%.2f’表示保留兩位小數 |
| columns | 表示指定寫入哪列數據的列名,默認為None |
| header | 表示是否寫入數據中的列名,默認為False,表示不寫入 |
| index | 表示是否將行索引寫入文件,默認為True |
| mode | str類型,表示寫入模式默認為’w’ |
| encodig | str類型,表示寫入文件的編碼格式 |
例如,創建A,B,C三列數據,然后將數據寫入CSV文件中,代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 5:14 PM # 文件 :創建CSV文件.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建三列數據 data = {'A':[1, 2, 3], 'B':[4, 5, 6], 'C':[7, 8, 9]} # 創建DataFrame對象 df = pd.DataFrame(data) # 存儲CSV文件 df.to_csv('test.csv')運行代碼后, 文件夾目錄中將自動生成一個test.csv文件,在Pycharm中打開該文件,將顯示如下圖所示內容:
說 明
圖中第一列數據為默認生成的索引列,在寫入數據時如果不需要默認的索引列,可以在to_csv()函數中設置index參數為False即可。
2. CSV文件的讀取
? pandas模塊提供了read_csv()函數用于CSV文件的讀取工作。read_csv()函數中常用的參數及含義如下表:
? read_csv()函數常用的參數及含義
| filepath_or_buffer | 表示文件路徑的字符串 |
| sep | str類型,表示分隔符,默認為逗號“,” |
| header | 表示將哪一行數據作為列名 |
| index_col | 通過列索引指定列的位置,默認為None |
| names | 為讀取后的數據設置列名,默認為None |
| skiprows | int類型,需要跳過的行號,從文件內數據的開始處算起 |
| skipfooter | int類型,需要跳過的行好,從文件內數據的末尾處算起 |
| na_values | 將指定的值設置為NaN |
| nrows | int類型,設置需要讀取數據中的前n行數據 |
| encoding | str類型,用于設置文本編碼格式。例如,“utf-8“表示UTF-8編碼 |
| squeeze | 設置為True,表示如果解析的數據只包含一列,則返回一個Series。默認為False |
| engine | 表示數據解析的引擎,可以指定為c或python,默認為c |
? 在實現一個簡單的讀取CSV文件時,直接調用pandas.read_csv()函數,然后指定文件路徑即可。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 5:50 PM # 文件 :讀取csv文件.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd # 讀取csv文件信息 data = pd.read_csv('test.csv')# 輸出讀取的文件內容 print('讀取的CSV文件內容為:\n', data)程序運行結果如下:
讀取的CSV文件內容為:Unnamed: 0 A B C 0 0 1 4 7 1 1 2 5 8 2 2 3 6 9Process finished with exit code 0? 還可以將讀取出來的數據指定列,寫入到新的文件當中。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 5:59 PM # 文件 :將讀取出來的csv數據指定列寫到新的文件中.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 讀取csv文件信息 data = pd.read_csv('test.csv') # 將讀取的信息中指定列,寫入新的文件中 data.to_csv('new_test.csv', columns=['B', 'C'], index=False) # 讀取新寫入的CSV文件信息 new_data = pd.read_csv('new_test.csv') # 打印新文件信息 print('讀取新的csv文件內容為:\n', new_data)程序運行結果如下:
讀取新的csv文件內容為:B C 0 4 7 1 5 8 2 6 9Process finished with exit code 0存取Excel文件
1. Excel文件的存儲
? Excel文件是一種大家都比較熟悉的常用辦公表格文件,是微軟公司推出的辦公軟件中的一個組件。Excel文件的擴展名目前兩種,一種為.xls,另一種為.xlsx,其擴展名主要根據辦公軟件版本決定。
? 通過DataFrame的數據對象直接調用to_excel()方法即可實現Excel文件的寫入功能,該方法的參數含義與to_csv()方法類似。通過to_excel()方法向Excel文件寫入信息的代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 6:18 PM # 文件 :to_excel()方法寫入excel文件.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd# 創建三列數據 data = {'A':[1, 2, 3],'B':[4, 5, 6], 'C':[7, 8, 9]} # 創建DataFrame對象 df = pd.DataFrame(data) # 存儲Excel文件 df.to_excel('test.xlsx')2. Excel文件的讀取
? pandas 模塊的read_excel()函數用于Excel文件的讀取,該函數中常用的參數及含義如下表:
? read_excel()函數常用參數及含義
| io | 表示文件路徑的字符串 |
| sheet_name | 表示指定Excel文件內的分表位置,返回多表可以使用sheet_name=[0,1],默認為0 |
| header | 表示指定哪一行數據作為列名,默認為0 |
| skiprows | int類型,需要跳過的行號,從文件內數據的開始處算起 |
| skip footer | int類型,需要跳過的行好,從文件內數據的末尾處算起 |
| index_col | 通過列索引指定列的位置,默認為None |
| names | 指定列的名字 |
? 在沒有特殊情況下,讀取Excel文件內容與讀取CSV文件內容相同,直接調用pandas.read_excel()函數即可。示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 6:31 PM # 文件 :讀取excel文件.py # IDE :PyCharm# 導入pandas模塊 import pandas as pd # 讀取Excel文件內容 data = pd.read_excel('test.xlsx') print('讀取的Excel文件內容為:\n', data)? 程序運行結果如下:
讀取的Excel文件內容為:Unnamed: 0 A B C 0 0 1 4 7 1 1 2 5 8 2 2 3 6 9Process finished with exit code 0SQLite數據庫
? 與許多其他數據庫管理系統不同,SQLite不是一個客戶端/服務器結構的數據庫引擎,而是一種 嵌入式數據庫,它的數據庫就是一個文件。SQLite將整個數據庫,包括定義、表、索引以及數據本身,作為一個單獨的、可跨平臺使用的文件存儲在主機中。由于SQLite本身是C語言編寫的,而且體積很小,所以經常被集成到各種應用程序中。Python就內置了SQLite3,所以,在Python中使用SQLite數據庫,不需要安裝任何模塊,可以直接使用。
創建數據庫文件
? 由于Python中已經內置了SQLite3, 所以可以直接使用import語句導入SQLite3模塊。Python操作數據庫的通用的流程如圖所示:
? 例如,創建一個名稱為mySoft.db的SQLite數據庫文件,然后執行SQL語句創建一個user(用戶表),user表包含id和name兩個字段,示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/14/22 8:27 PM # 文件 :創建mySoft.db的SQLite數據庫.py # IDE :PyCharmimport sqlite3 # 連接到SQLite數據庫 # 數據庫文件是mySoft.db,如果文件不存在,會自動在當前目錄創建 conn = sqlite3.connect('mySoft.db') # 創建一個Cursor cursor = conn.cursor()# 執行一條SQL語句,創建user表 cursor.execute('create table user(id int(10) primary key, name varchar(20))') # 關閉游標 cursor.close() # 關閉connection conn.close()說 明
上面代碼只能運行一次,再次運行時,會提示錯誤信息:sqlite3.OperationalError:table user already exists。這是因為user表已經存在
操作SQLite
1. 新增用戶數據信息
? 為了向數據表中新增數據,可以使用如下SQL語句:
insert into 表名(字段名1, 字段名2,....,字段名n) values(字段值1, 字段值2,.....,字段值n)? 例如,在user表中有2個字段,字段名分別為id和name。而 字段值需要根據字段的數據類型來賦值,例如,id是一個長度為10的整型,name是長度為20的字符串型數據。向user表中插入3條用戶信息記錄,SQL語句如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 6:26 AM # 文件 :新增用戶數據信息.py # IDE :PyCharmimport sqlite3 # 連接到SQLite數據庫 # 數據庫文件是mySoft.db,如果文件不存在,會自動在當前目錄創建 conn = sqlite3.connect('mySoft.db') # 創建一個Cursor cursor = conn.cursor() # 執行一條SQL語句,創建user表 cursor.execute('create table user (id int(10) primary key, name varchar(20))') # 插入3條數據 cursor.execute('insert into user (id, name) values("1", "Bruce_liu")') cursor.execute('insert into user (id, name) values("2", "Andy")') cursor.execute('insert into user (id, name) values("3", "光輝歲月")')# 提交commit() cursor.commit() # 關閉游標 cursor.close() # 關閉connection conn.close()2. 查看用戶數據信息
? 查找user表中的數據可以使用如下SQL語句:
selec 字段名1, 字段名2, 字段名3,.... from 表名 where 查詢條件? 查看用戶信息的代碼與插入數據信息的代碼大致相同,不同之處在于使用的SQL語句不同。此外,查詢數據時通常使用如下3種方式:
? § fetching():獲取查詢結果集中的下一條記錄
? § fetch many(size):獲取指定數量的記錄
? § fetch all():獲取結果集的所有記錄
? 下面通過示例來練習這3種查詢方式的區別:
例如,分別使用fetchone()、fetch many(size)、fetchall()這3種方式查詢用戶信息,代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 6:38 AM # 文件 :查看用戶數據信息.py # IDE :PyCharm# 導入模塊 import sqlite3 # 連接到SQLite數據庫 # 數據庫文件是mySoft.db,如果文件不存在,會自動在當前目錄創建 conn = sqlite3.connect('mySoft.db') # 創建一個Cursor cursor = conn.cursor() # 執行查詢語句 cursor.execute('select * from user')# 獲取查詢結果result1 = cursor.fetchone() # 使用fetchone()獲取一條信息 print(result1) result2 = cursor.fetchmany(2) # 使用fetchmany(size)方法查詢指定數量的數據 print(result2) result3 = cursor.fetchall() # 使用fetchall()方法查詢所有數據 print(result3) # 關閉游標 cursor.close() # 關閉鏈接 conn.close()? 程序運行結果如下:
(1, 'Bruce_liu') [(2, '小薇'), (3, '海闊天空')] [(1, 'Bruce_liu'), (2, '小薇'), (3, '海闊天空')]? 修改上面代碼為條件查詢,示例如下:
cursor.execute('select * from user where id > ?', (1, )) result3 = cursor.fetchall() print(result3)? 程序運行結果如下:
[(2, '小薇'), (3, '海闊天空')]Process finished with exit code 0? 在select查詢語句中,使用問號作為占位符代替具體的數值,然后使用一個元組來替換問號(注意,不要忽略元組中最后的逗號)。上述條件查詢語句等價于:
cursor.execute('select * from user where id > 1')說 明
使用占位符的方式可以避免SQL注入的風險,推薦使用這樣的方式
3. 修改用戶數據信息
? 修改user表中的數據可以使用如下SQL語句:
update 表名 set 字段名 = 字段值 where 查詢條件? 例如,將SQLite數據庫中user表id 為1的數據name字段值修改為’李小龍’,代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 7:33 AM # 文件 :刪除用戶數據信息.py # IDE :PyCharm# 導入模塊 import sqlite3# 連接數據庫 conn = sqlite3.connect('mySoft.db') # 創建cursor cursor = conn.cursor()# 執行語句 cursor.execute('delete from user where id = ?', (1, )) # 提交 conn.commit() # 關閉游標 cursor.close() # 關閉連接 conn.close()MySQL數據庫
MySQL服務器下載及安裝
? 本人的運行環境為macOS系統,在terminal下執行brew install mysql@5.7進行安裝,這里不再贅述。
liuxiaowei@MacBookAir ~ % brew install mysql@5.7 ==> Downloading https://ghcr.io/v2/homebrew/core/mysql/5.7/manifests/5.7.36 Already downloaded: /Users/liuxiaowei/Library/Caches/Homebrew/downloads/3bd8201ca705f862e6a7e4c71ec30e87f77b9372889bd10d37989ac9edf694b1--mysql@5.7-5.7.36.bottle_manifest.json ==> Downloading https://ghcr.io/v2/homebrew/core/mysql/5.7/blobs/sha256:5289b664 Already downloaded: /Users/liuxiaowei/Library/Caches/Homebrew/downloads/e6da9b8d37c53e90332bc6c290ce514b6913c16310d45cad80490b191d45c903--mysql@5.7--5.7.36.monterey.bottle.tar.gz ==> Pouring mysql@5.7--5.7.36.monterey.bottle.tar.gz ==> Caveats We've installed your MySQL database without a root password. To secure it run:mysql_secure_installationMySQL is configured to only allow connections from localhost by defaultTo connect run:mysql -urootmysql@5.7 is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula.If you need to have mysql@5.7 first in your PATH, run:echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrcFor compilers to find mysql@5.7 you may need to set:export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"To restart mysql@5.7 after an upgrade:brew services restart mysql@5.7 Or, if you don't want/need a background service you can just run:/usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql ==> Summary 🍺 /usr/local/Cellar/mysql@5.7/5.7.36: 320 files, 234.3MB ==> Running `brew cleanup mysql@5.7`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).說 明
如果安裝遇到問題,本人之前已經發布一篇解決問題的博客,鏈接地址:
https://blog.csdn.net/weixin_41905135/article/details/122583513?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164488355516780261997164%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164488355516780261997164&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-122583513.nonecase&utm_term=%E5%AE%89%E8%A3%85mysql5.7&spm=1018.2226.3001.4450
啟動SQL
使用MySQL數據庫前,需要先啟動MySQL。在terminal窗口中,輸入命令:
MacBookAir:~ root# /usr/local/opt/mysql\@5.7/bin/mysql.server start啟動結果如下:
Starting MySQL. SUCCESS!使用Navicat 操作管理MySQL
? § 1. 打開Navicat,新建MySQL連接,輸入連接信息。(本例)連接名:python-mysql,輸入主機名后IP地址“localhost“或"127.0.0.1",輸入密碼,如下圖:
? § 2. 創建完成以后,雙擊python-mysql,進入數據庫。如下圖:
? § 3. 創建一個名為“myPython“的數據庫,步驟為:右鍵單擊python-mysql,選擇“新建數據庫“,填寫數據庫信息,如下圖:
安裝PyMySQL
? 由于MySQL服務器獨立的進程行,并通過網絡對外服務,所以,需要支持Python的MySQL驅動連接到MySQL服務器。在Python中支持MySQL的數據庫模塊有很多,我們選擇使用PyMySQL模塊。
? PyMySQL模塊的安裝比較簡單,在CMD命令行窗口中運行如下命令即可:
pip install PyMySQL連接數據庫
? 使用數據庫的第一步是連接數據庫。接下來使用PyMySQL模塊連接數據庫。由于PyMySQL模塊頁遵循Python Database API2.0規范,所以操作MySQL數據庫的方式與SQLite相似。前面已經創建了一個MySQL連接“python-mysql“,并且在安裝數據庫時設置了數據庫的用戶名"root"和密碼“12345”。下面通過以上信息,使用connect()方法連接MySQL數據庫,代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 12:19 PM # 文件 :使用connect()方法連接MySQL數據庫.py # IDE :PyCharm# 導入模塊 import pymysql# 打開數據庫連接,參數1:主機名或IP;參數2:用戶名;參數3:密碼;參數4:數據庫名 db = pymysql.connect(host='localhost', database='myPython', port=3306, user='root', password='12345')# 使用cursor()方法創建一個游標對象cursor cursor = db.cursor() # 使用execute()方法執行SQL查詢 cursor.execute('SELECT VERSION()') # 使用fetchone()方法獲取單條數據 data = cursor.fetchone() print('Database version :%s '% data) # 關閉數據庫連接 db.close()? 上述代碼中,首先使用connect()方法連接數據庫,然后使用cursor()方法創建游標,接著使用execute()方法執行SQL語句查看MySQL數據庫版本,然后使用fetchone()方法獲取數據,最后使用close()方法關閉數據庫連接,運行結果如下:
Database version :5.7.36 Process finished with exit code 0創建數據庫表
? 數據庫連接成功以后,接下來就可以為數據庫創建數據表了。創建數據庫表需要使用excute()方法,本例使用該方法創建一個books圖書表,books表包含id(主鍵)、name(圖書名稱)、category(圖書分類)、price(圖書價格)和publish_time(出版時間)5個字段。創建books表SQL語句如下:
CREATE TABLE books(id int(8) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL,category varchar(50) NOT NULL,price decimal(10,2) DEFAULT NULL,publish_time date DEFAULT NULL,PRIMARY KEY(id)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET = utf8;? 備注 在創建表之前,使用如下語句實現當前數據庫表存在時先刪除:
DROP TABLE IF EXISTS 'books';示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 12:44 PM # 文件 :創建數據表.py # IDE :PyCharm# 導入模塊 import pymysql # 打開數據庫連接 db = pymysql.connect(host='localhost', database='myPython', port=3306, user='root', password='12345')# 使用cursor()方法創建一個游標對象 cursor = db.cursor() # 使用預處理語句創建表 sql = ''' CREATE TABLE books(id int(8) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL,category varchar(50) NOT NULL,price decimal(10,2) DEFAULT NULL,publish_time date DEFAULT NULL,PRIMARY KEY(id)) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET = utf8; ''' # 執行SQL語句 cursor.execute(sql) # 關閉數據庫連接 db.close()? 運行上述代碼后,myPython數據庫下會創建一個books表。打開Navicat(如果已經打開按下鍵刷新),發現myPython數據庫下多了一個books表,右鍵單擊books,選擇設計表,如下圖所示:
操作MySQL數據表
? MySQL數據表的操作主要包括數據的增、刪、改、查,與操作SQLite類似,我們使用executemany()方法向數據表中批量添加多條記錄,executemany()方法格式如下:
exeutemany(operation, seq_of_params)? § operation:操作的SQL語句
? § seq_of_params:參數序列
示例代碼如下:
#_*_coding:utf-8_*_ # 作者 :liuxiaowei # 創建時間 :2/15/22 1:04 PM # 文件 :向數據表中批量添加多條記錄.py # IDE :PyCharm# 導入模塊 import pymysql# 打開數據庫連接 db = pymysql.connect(host="localhost", user="root", password="12345", database="myPython",charset="utf8") # 使用cursor()方法獲取操作游標 cursor = db.cursor() # 數據列表 data = [("零基礎學Python",'Python','79.80','2018-5-20'), ("Python從入門到精通",'Python','69.80','2018-6-18'), ("零基礎學PHP",'PHP','69.80','2017-5-21'), ("PHP項目開發實戰入門",'PHP','79.80','2016-5-21'), ("零基礎學Java",'Java','69.80','2017-5-21'), ] try:# 執行sql語句,插入多條數據cursor.executemany("insert into books(name, category, price, publish_time) values (%s,%s,%s,%s)", data)# 提交數據db.commit() except:# 發生錯誤時回滾db.rollback()# 關閉數據庫連接 db.close()運行上述代碼,在Navicat中查看books表數據,如下圖:
注 意
? § 使用connect()方法連接數據庫時,額外設置字符集“charset=utf-8“, 可以防止插入中文出錯。
? § 在使用insert語句插入數據時,使用**“%s“**作為占位符,可以防止SQL注入。
總 結
總結
以上是生活随笔為你收集整理的Python爬虫-数据处理与存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 考研二战备考五十天,最终成功上岸
- 下一篇: 手把手带你在集成SpringSecuri