3-數據存儲之文件存儲(1)

  • 2019 年 11 月 8 日
  • 筆記

本節內容:

  • 簡介

    ——————文件存儲——————

  • TXT文本存儲

  • JSON文件存儲

  • CSV文件存儲

    ——————關係型資料庫—————

  • MySQL存儲

    ——————非關係資料庫—————

  • Mongodb

  • redis

一 簡單介紹:

我們前面很少將提取的數據或者獲取的源碼保存下來;其實日常的工作中在解析出數據後接下來就是存儲數據。

保存數據的形式有多種多樣txtjsoncsvmysqlmobgodbredis,接下來我們一一介紹。

1). txt文本存儲:

python txt文件操作中離不開open()函數,它可以創建或者打開指定的文件,並創建一個文件對象 ,基本的語法:

1 open() 函數用於創建或打開指定文件,該函數的語法格式如下:  2 file = open(file_name,"文件打開方式")

文件打開的方式有以下幾種:

模式 意義 注意事項
r 只讀模式打開文件,讀文件內容的指針會放在文件的開頭。 操作的文件必須存在。
rb 以二進位格式、採用只讀模式打開文件,讀文件內容的指針位於文件的開頭,一般用於非文本文件,如圖片文件、音頻文件等。  
r+ 打開文件後,既可以從頭讀取文件內容,也可以從開頭向文件中寫入新的內容,寫入的新內容會覆蓋文件中等長度的原有內容。  
rb+ 以二進位格式、採用讀寫模式打開文件,讀寫文件的指針會放在文件的開頭,通常針對非文本文件(如音頻文件)。  
w 以只寫模式打開文件,若該文件存在,打開時會清空文件中原有的內容。 若文件存在,會清空其原有內容(覆蓋文件);反之,則創建新文件。
wb 以二進位格式、只寫模式打開文件,一般用於非文本文件(如音頻文件)  
w+ 打開文件後,會對原有內容進行清空,並對該文件有讀寫許可權。  
wb+ 以二進位格式、讀寫模式打開文件,一般用於非文本文件  
a 以追加模式打開一個文件,對文件只有寫入許可權,如果文件已經存在,文件指針將放在文件的末尾(即新寫入內容會位於已有內容之後);反之,則會創建新文件。  
ab 以二進位格式打開文件,並採用追加模式,對文件只有寫許可權。如果該文件已存在,文件指針位於文件末尾(新寫入文件會位於已有內容之後);反之,則創建新文件。  
a+ 以讀寫模式打開文件;如果文件存在,文件指針放在文件的末尾(新寫入文件會位於已有內容之後);反之,則創建新文件。  
ab+ 以二進位模式打開文件,並採用追加模式,對文件具有讀寫許可權,如果文件存在,則文件指針位於文件的末尾(新寫入文件會位於已有內容之後);反之,則創建新文件。  

熟悉/了解上面的知識點後(詳細資訊:菜鳥教程/w3school),我們實例一下;

小說網站:https://xs.sogou.com/mianfei/ 獲取書名、簡潔並保存為txt文件:

 1 import requests   2 import json   3 #設置ua   4 headers = {   5     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36",   6 }   7 #獲取網頁源程式碼   8 r = requests.get("https://xs.sogou.com/api/pc/v1/activity/freeread/current?pageNo=1&pageSize=12",headers=headers).text   9 #json格式一下  10 html = json.loads(r)  11 #接下來就是獲取數據  12 name = html["data"]["pageList"]  13 for i in name:  14     bookName = i["bookName"]  15     content = i["description"]  16     #寫入數據  17     with open("小說.txt","a",encoding="utf-8") as f:  18         f.write(bookName)  19         f.write(content)  20         f.write("n"+ "==" * 20 + "n")  21         print("已寫入......")  22 with as的方式實現數據存儲好處:不需要調用close()方法  23 以上寫入還可以使用:  24     file = open("小說.txt","a",encoding="utf-8" )  25     file.write(bookName)  26     file.write(content)  27     file.write("n"+ "==" * 20 + "n")  28     print("已寫入......")  29 最後結果都是一樣的

註:有細心的同學發現我用的url跟網站的url是不一樣的,這個是怎麼回事??

原來使用requests請求的出來的數據沒有小說的資訊(數據),抓包發現該網站是通過Ajax技術實現數據的請求,所以我找到 了該網站的API,如圖所示:

這樣我們直接請求這個網址後得到的就是一個json的數據文件,之後我們解析一下就可以了。

2). JSON文件存儲:

先官方話了解一下: JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。

JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、Java、JavaScript、Perl、Python等)。

這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。

你讀一遍的話會懵逼的,不要慌,你暫時不要管,學習它常用的:

json: 用於字元串和python數據類型間進行轉換 ,它提供四個功能 dumps、dump、loads、load ,用的比較多的是(loads,dumps)下面我們學習下。

loads():將JSON文本字元串轉換成JSON對象;

dumps():將JSON對象轉換成JSON文本字元串;

 1 #在我們上面的小說例子中,我們使用的就是loads()   2 import json   3  4 test_dict = {'bigberg': [7600, {1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}]}   5 print(test_dict)   6 print(type(test_dict))   7 #dumps 將數據轉換成字元串   8 json_str = json.dumps(test_dict)   9 print(json_str)  10 print(type(json_str))  11 #loads: 將字元串轉換為字典  12 new_dict = json.loads(json_str)  13 print(new_dict)  14 print(type(new_dict))

dump: 將數據寫入json文件中 ; load:把文件打開,並把字元串變換為數據類型 ;有興趣的同學可以學習一下用法。

3). CSV文件存儲:

使用csv文件存儲,我理解的就是表格存儲,Excel都用過吧,就是那個;接下來我們分文件的寫入跟讀取兩部分分開講解,請系好安全帶(如果非要介紹定義的話,請百度……我就是懶);

簡單寫入,首先打開一個csv文件,指定打開的模式然後使用write()方法初始化寫入對象,最後調用writerow()方法傳入每行的數據即可,程式碼如下:

1 import csv  2 #如果不加newline參數的話,會自動這隻每行換行,如下圖所示  3 #加上以後就不會出現下圖的問題,小技巧,你值得擁有  4 with open("name.csv","w",newline="") as f:  5     writer = csv.writer(f)  6     #傳入的是一個列表  7     writer.writerow(["num","name","age","sex"])  8     writer.writerow(["100","",12,""])  9     writer.writerow(["101","",13,""])

效果圖如下:

可以看到還有排版的問題,更多的功能等你發掘;

簡單讀取:我們需要構造reader對象,通過遍歷的方式輸出每行的資訊;程式碼及效果圖如下:

 1 import csv   2  3 with open("name.csv",'r') as f:   4     reader = csv.reader(f)   5     for i in reader:   6         print(i)   7  8 #接觸到pandas的話你會了解到read_csv()方法:   9 import pandas as pd  10 df = read_csv("name.csv")  11 print(df)

這個要比第一個方式舒服很多。。。。。

未完待續……..