天天看點

基于Python操作将資料存儲到本地檔案

前面說過Python爬取的資料可以存儲到檔案、關系型資料庫、非關系型資料庫。前面兩篇文章沒看的,可快速戳這裡檢視!《使用Python将資料存入SQLite3資料庫》

《基于Python的SQLite基礎知識學習》而存儲到檔案的資料一般都具有時效性,例如股市行情、商品資訊和排行榜資訊等等。這樣的資訊是具有動态性的,非特殊要求,可以存放到檔案中,下面讓我們來看一下存入檔案的幾種方法,文章有點長,但全是幹貨,請耐心看完。

Txt檔案存儲

将資料儲存到TXT檔案很簡單,使用如下文法即可打開一個檔案寫入資料。

with open('test.txt','w',encoding='utf-8') as file:

file.write()

這裡來看一個例子:爬取知乎上“發現”頁面的熱門話題部分,将問題和答案統一儲存為txt格式。

import requests

#使用requests庫将網頁源碼擷取下來

from pyquery import PyQuery as pq

#使用pyquery解析庫解析

url = 'http://www.zhihu.com/explore'

headers = {

'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Mobile 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()

with open('test.txt','w',encoding='utf-8') as file:

file.write('\n'.join([question,author,answer]))

file.write('\n' + '=' * 50 + '\n')

基于Python操作将資料存儲到本地檔案

如下圖所示,可以看到這篇文章已經寫入文本檔案了。

基于Python操作将資料存儲到本地檔案

JSON檔案存儲

JSON(javaScript Object Notation,也就是JavaScript對象标記)

JSON是通過數組和對象的組合來表示資料,構造簡潔但結構化程度非常高,是一種輕量級的資料交換格式。Python為我們提供了簡單易用的 JSON庫來實作JSON檔案的讀寫操作,我們可以調用 JSON loads()方法将JSON文本字元串轉為JSON對象,可以通過 dumps()方法将 JSON 對象轉為文本字元串,具體看下面代碼。

import json

str = '''[{

"name":"Bob",

"gender":"male",

"birthay":"1992-10-18"

} , {

"name":"Selina",

"gender":"female",

"birthdat":"1995-10-18"

}]'''

print(type(str))

data = json.loads(str)

print(data)

print(type(data))

基于Python操作将資料存儲到本地檔案

另外我們可以使用dumps()方法将JSON對象轉化為字元串,如下圖所示。

import json

data = [{

'name':'Bob',

'gende':'male',

'birthday':'1992-10-18'

}]

with open ('data.json','w') as file:

#如果想儲存為JSON格式的,可以在加一個參數indent=2即可。

file.write(json.dumps(data))

#加參數後的data.json檔案内容如下

'''

[

{

"name": "Bob",

"gende": "male",

"birthday": "1992-10-18"

}

]

'''

基于Python操作将資料存儲到本地檔案

還有一種常見的問題,若JSON檔案包含中文字元呢?這樣打開肯定會出現亂碼的,那麼我們該怎麼辦呢?看下面代碼。

import json

data = [{

'name':'小馬',

'gende':'女',

'birthday':'1994-12-30'

}]

with open ('data.json','w') as file:

file.write(json.dumps(data,indent=2))

基于Python操作将資料存儲到本地檔案

看到這樣的内容,肯定不是我們想要的結果啊,中文字元都變成了Unicode字元,那麼,為了顯示中文字元,還需要指定參數ensure_asci為 False,另外還需要規定輸出檔案的編碼。這樣就可以完美的将中文顯示出來了,如下圖所示。

with open('data.json','w',encoding='utf-8') as file:

file.write(json.dumps(data,indent=2,ensure_ascii=False))

基于Python操作将資料存儲到本地檔案

CSV檔案存儲

CSV(Comma-Separated Values),中文可成為逗号分隔值或字元分隔值,其檔案以純文字形式存儲表格資料。

Python标準庫自帶CSV子產品,不用自行安裝,直接導入即可,代碼如下。

import csv

#這裡如若檔案存在則直接打開,不存在可自動建立,若不設定newline = ''每行資料會隔一行空白行

with open('csv_test.csv','w',newline = '') as csvfile:

#将檔案加載到CSV對象中

write = csv.writer(csvfile)

#寫入一行表頭資料

write.writerow(['姓名','年齡','電話'])

#多行資料寫入

data = {('zhangsan','15','13809391234'),('lisi','25','13512340000')}

#關閉CSV對象

write.writerows(data)

基于Python操作将資料存儲到本地檔案

寫資料到CSV使用open函數便可打開檔案,那麼讀CSV資料則使用reader和DictReader,兩者都是接收一個可疊代的對象,傳回一個生成器。reader函數傳回是将一行資料以清單形式傳回,而DictReader函數傳回的是一個字典,字典的值是單元格的值,字典的鍵則是這個單元格的标題,具體可看如下代碼。

import csv

csvfile = open ('csv_test.csv','r')

#以清單形式輸出

reader = csv.reader(csvfile)

#以字典形式輸出,第一行作為字典的鍵

#reader1 = csv.DictReader(csvfile)

rows = [row for in reader]

print(rows)

#以下為輸出結果

#[['姓名', '年齡', '電話'], ['zhangsan', '15', '13809391234'], ['lisi', '25', '13512340000']]

#以字典的形式輸出,第一行作為字典的鍵

import csv

csvfile = open('csv_test.csv','r')

reader = csv.DictReader(csvfile)

for row in reader:

print(row)

#以下為輸出結果

#OrderedDict([('姓名', 'zhangsan'), ('年齡', '15'), ('電話', '13809391234')])

#OrderedDict([('姓名', 'lisi'), ('年齡', '25'), ('電話', '13512340000')])

以上代碼實作了将整個檔案資料全部列印出來了,在實際資料中這也不太現實,我們可能會擷取某行的資料,則可以使用循環全部資料再對每行資料進行判斷,符合條件的資料篩選出來,具體代碼如下。

import csv

csvfile = open('csv_test.csv','r')

#以清單形式輸出

reader = csv.reader(csvfile)

for row in reader:

if 'lisi' in row:

print(row)

#以下是輸出結果

#['lisi', '25', '13512340000']

如果你接觸過pandas的話,使用起來也很友善

>>> import pandas as pd

>>> df = pd.read_csv('csv_test.csv',encoding ='gb2312')

>>> print(df)

姓名 年齡 電話

0 zhangsan 15 13809391234

1 lisi 25 13512340000

>>>

值得注意的是這裡可能會出現亂碼,需要指定字元編碼,csv檔案的編碼為gb2312或utf-8時,指定編碼格式pd.read_csv(name, encoding='gb2312')可解決亂碼問題;如果編碼格式為utf-8,則另存為txt檔案,pd.read_table(name) 不用指定編碼格式,也可以解決亂碼問題。

基于Python操作将資料存儲到本地檔案

使用CSV存儲資料相對而言還是簡單的,這個也是經常使用的方式,實用性很強,小夥伴要掌握哦,下面順道說一下EXCEL格式資料的讀寫。

Excel檔案存儲

python操作Excel時,對應的有不同的版本支援庫,若Excel為2003時,需選擇pyExcelerator;若Excel為2007時,需選擇openpyxl;而xlrd庫支援所有版本的資料讀取,xlwt庫支援所有版本的資料寫入。

是以,考慮到相容性一般都選擇使用 xlrd和xlwt,Windows環境CMD下直接使用pip安裝即可。

pip3 install xlrd

pip3 install xlwt

将資料寫入到Excel是比較複雜的,有格式以及公式、插入圖檔等的功能,下面直接看寫入Excel的文法。

import xlwt

#建立一個Excel檔案

wb = xlwt.Workbook()

#在建立的檔案中建立一個名為Python的工作簿

ws = wb.add_sheet(‘Python’,cell_overwrite_ok=True)

#定義字型對齊方式對象

alignment = xlwt.Alignment()

#設定水準方向

#HORZ_GENERAL,HORZ_LEFT,HORZ_CENTER,HORZ_RIGHT,HORZ_FILLED

#HORZ_JUSTIFIED,HORZ_CENTER_ACROSS_SEL,HORZ_DISTRIBUTED

alignment.horz = xlwt.Alignment.HORZ_CENTER

#設定垂直方向

#VERT_TOP,VERT_CENTER,VERT_BOTTOM,VERT_JUSTIFIED,VERT_DISTRIBUTED

alignment.vert = xlwt.Alignment.VERT_CENTER

#定義格式對象

style = xlwt.XFStyle()

style.alignment = alignment

#合并單元格write_merge(開始行,結束行,開始列,結束列,内容,格式)

ws.write_merge(0,0,0,5,'Python資料存儲',style)

#寫入資料we.write(行,列,内容)

for i in range(2,7):

for k in range(5):

ws.write(i,k,i+k)

#Excel公式xlwt.Formula

ws.write(i,5,xlwt.Formula('SUM(A'+srt(i+1)+ ':E'+str(i+1)+')'))

#wb.save('file.xls')

#插入bmp格式圖檔,insert_bitmap(img,x,y,x1,y1,scale_x=0.8,scale_y=1)

#x表示行數,y表示列數,x1表示相對原來位置向下偏移的像素,y1表示相對原來位置像右偏移的像素,scale_x、scale_y表示縮放比例

ws.insert_bitmap('G:\\img.bmp',9,1,2,2,scale_x=0.3,scale_y=0.3)

#儲存檔案

wb.save('file.xls')

基于Python操作将資料存儲到本地檔案

Excel中還有其他的單元格顔色,單元格邊框,字型顔色,字型大小,資料類型等等,這裡就不展開描述了,下面來看看Excel讀取資料。

讀取資料需要第三方庫 xlrd 來實作,具體代碼如下。

import xlrd

wb = xlrd.open_workbook('file.xls')

#擷取工作簿的zongshu

ws_count = wb.nsheets

print('Sheets總數:',ws_count)

#通過索引順序擷取Sheets

#ws = wb.sheets() [0]

#ws = wb.sheet_by_index(0)

#通過Sheets名擷取Sheets

ws = wb.sheet_by_name('Python')

#擷取整行的值,以清單形式傳回

row_value = ws.row_values(3)

print('第四行資料為:',row_value)

#擷取整列的值,以清單形式傳回

row_col = ws.col_values(3)

print('D列的資料為:',row_col)

#擷取所有的lie

nrows = ws.nrows

ncols = ws.ncols

print('總行數為:',nrows,'總列數為:',ncols)

#擷取某個單元格内容cell(行,列)

cell_F3 = ws.cell(2,5).value

print('F3單元格内容為:',cell_F3)

#使用行列索引擷取某個單元格的内容

row_F3 = ws.row(2)[5].value

col_F3 = ws.col(5)[2].value

print('F3單元格的内容為:',row_F3, '\n' 'F3單元格的内容為:',col_F3)

基于Python操作将資料存儲到本地檔案

看到這裡,順便在說一下怎麼把資料存儲到Word中,Word文檔中存儲的一般為文章、新聞報道和小說這類文字内容較長的資料。

Word資料存儲

Python讀取Word也是需要第三方擴充庫來支援,使用pip install python-docx安裝即可。

下面通過例子說明怎麼使用Python讀取資料吧,廢話不多說,直接看代碼。

from docx import Document

from docx.shared import Inches

#建立對象

document = Document()

#添加标題,其中'0'代表标題類型,一共有4種類型,具體可在Word的開始菜單,樣式下檢視

document.add_heading('Python爬蟲基礎學習',0)

#添加正文内容并設定部分内容格式

p = document.add_paragraph('Python爬蟲-')

#設定内容加粗

p.runs[0].bold = True

#添加内容并加粗

p.add_run('資料存儲-').bold = True

#添加内容

p.add_run('Word-')

#添加内容并設定為斜體

p.add_run('存儲執行個體。').italic = True

#添加正文,設定“樣式”——> "明顯引用"

document.add_paragraph(“樣式-明顯引用”,style = 'IntenseQuote')

#添加正文,設定“項目符号”

document.add_paragraph(

'項目符号1',style = 'ListBullet'

)

document.add_paragraph(

'項目符号2',style = 'ListNumber'

)

#添加圖檔

document.add_picture('G:\\img.bmp',width = Inches(1.25))

#添加表格

table = document.add_table(rows = 1, cols = 3)

hdr_cells = table.rows[0].cells

hdr_cells[0].text = 'Qty'

hdr_cells[1].text = 'Id'

hdr_cells[2].text = 'Desc'

for item in range(2):

row_cells = table.add_row().cells

row_cells[0].text = 'a'

row_cells[1].text = 'b'

row_cells[2].text = 'c'

#儲存檔案

document.add_page_break()

document.save('test.docx')

通過以上代碼便将資料寫入到Word,最終結果如下圖所示。

基于Python操作将資料存儲到本地檔案

最後在看一眼怎麼讀取Words檔案資料,這個就相對比較簡單了,不用設定格式,直接讀取即可,代碼如下所示。

#讀取資料

import docx

def readDocx(docName):

fullText = []

doc = docx.Document(docName)

#讀取全部内容

paras = doc.paragraphs

#将每行資料存儲到清單

for p in paras:

fullText.append(p.text)

#将清單資料轉換成字元串

return '\n'.join(fullText)

print(readDocx('test.docx'))

基于Python操作将資料存儲到本地檔案

通過上圖看出,Word中的圖檔以及表格使用此方法是沒法讀取的,還是不盡如人意啊!

那麼本周分享就到這裡了,内容有點多,慢慢消化哦,下次分享怎麼将資料存儲到MySQL資料庫,小夥伴們準備好小闆凳繼續加油哦!!!

參考資料:黃永祥.清華大學出版社《玩轉Python網絡爬蟲》第九章.文檔資料存儲