1. 程式人生 > >第五章 數據存儲

第五章 數據存儲

nco find html 寫入文件 com 取出 bsp 最簡 con

第五章 數據存儲

  我們用解析器解析出數據之後,接下來的一步就是對數據進行存儲了,保存的形式可以多種多樣,最簡單的形式可以直接保存為文本文件,如 TXT、Json、CSV 等等,另外還可以保存到數據庫中,如關系型數據庫 MySQL,非關系型數據庫 MongoDB、Redis 等等。那麽本章我們就來統一了解一下數據的保存方式。

5.1 文件存儲

  文件存儲形式可以是多種多樣的,比如可以保存成 TXT 純文本形式,也可以保存為 Json 格式、CSV 格式等,本節我們來了解下文本文件的存儲方式。

5.1.1 TXT文本存儲

  將數據保存到 TXT 文本的操作非常簡單,而且 TXT 文本幾乎兼容任何平臺,但是有個缺點就是不利於檢索

,所以如果對檢索和數據結構要求不高,追求方便第一的話,可以采用 TXT 文本存儲,本節我們來看下利用 Python 保存 TXT 文本文件的方法。

1. 本節目標

  本節我們要保存知乎發現頁面的熱門問題部分,將其問題和答案統一保存成文本形式。

2. 基本實例

  首先可以用 Requests 將網頁源代碼獲取下來,然後使用 PyQuery 解析庫進行解析,接下來將提取的標題、回答者、回答保存到文本,代碼如下:

import requests
from pyquery import PyQuery as pq

url = ‘https://www.zhihu.com/explore‘
headers = {
    ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘
}
html = requests.get(url, headers=headers).text
doc = pq(html)
items = doc(‘.explore-tab .feed-item‘).items()
for item in items:
    question = item.find(‘h2‘).text()
    author = item.find(‘.author-link-line‘).text()
    answer = pq(item.find(‘.content‘).html()).text()
    file = open(‘explore.txt‘, ‘a‘, encoding=‘utf-8‘)
    file.write(‘\n‘.join([question, author, answer]))
    file.write(‘\n‘ + ‘=‘ * 50 + ‘\n‘)
    file.close()

  在這裏主要是為了演示文件保存的方式,因此 Requests 異常處理部分在此省去,我們首先用 Requests 提取了知乎發現頁面,然後將熱門問題的問題、回答者、答案全文提取出來,然後利用了Python提供的 open() 方法打開一個文本文件,獲取一個文件操作對象,這裏賦值為 file,然後利用 file 對象的 write() 方法將提取的內容寫入文件,最後記得調用一下 close() 方法將其關閉,這樣抓取的內容即可成功寫入到文本中了。

  運行程序,可以發現在本地生成了一個 explore.txt 文件,其內容如圖 5-1 所示:

技術分享圖片

圖 5-1 文件內容

  這樣熱門問答的內容就被保存文文本形式了。

  在這裏 open() 方法的第一個參數即為要保存的目標文件名稱,第二個參數為 a,代表以追加方式寫入到文本,另外我們還指定了文件的編碼為utf-8,最後寫入完成之後,我們還需要調用 close() 方法來關閉文件對象。

3. 打開方式

  在剛才的實例中,第二個參數我們設置成了 a,這樣在每次寫入文本時不會清空源文件,而是在文件末尾寫入新的內容,這是一種文件打開方式。關於文件打開方式,其實還有另外的幾種,在此列舉如下:

  • r,以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
  • rb,以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。
  • r+,打開一個文件用於讀寫。文件指針將會放在文件的開頭。
  • rb+,以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
  • w,打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
  • wb ,以二進制格式打開一個文件只用於寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
  • w+, 打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
  • wb+,以二進制格式打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
  • a,打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 ab 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。
  • a+,打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
  • ab+,以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。

4. 簡化寫法

  另外文件寫入還有一種簡寫方法,那就是使用 with as 語法,在 with 控制塊結束時,文件會自動關閉,所以就不需要再調用 close() 方法了。

  所以上面的保存方式我們可以簡寫如下:

with open(‘explore.txt‘, ‘a‘, encoding=‘utf-8‘) as file:
    file.write(‘\n‘.join([question, author, answer]))
    file.write(‘\n‘ + ‘=‘ * 50 + ‘\n‘)

  如果想保存時將原文清空,那麽可以將第二個參數改寫為 w,代碼如下:

with open(‘explore.txt‘, ‘w‘, encoding=‘utf-8‘) as file:
    file.write(‘\n‘.join([question, author, answer]))
    file.write(‘\n‘ + ‘=‘ * 50 + ‘\n‘)

5. 結語

  以上便是利用 Python 將結果保存為 TXT 文件的方法,此種方法簡單易用,操作高效,是一種最基本的保存數據的方法。

第五章 數據存儲