視頻音樂網(wǎng)站怎樣建設(shè)濰坊seo培訓(xùn)
大數(shù)據(jù)時(shí)代,各行各業(yè)對數(shù)據(jù)采集的需求日益增多,網(wǎng)絡(luò)爬蟲的運(yùn)用也更為廣泛,越來越多的人開始學(xué)習(xí)網(wǎng)絡(luò)爬蟲這項(xiàng)技術(shù),K哥爬蟲此前已經(jīng)推出不少爬蟲進(jìn)階、逆向相關(guān)文章,為實(shí)現(xiàn)從易到難全方位覆蓋,特設(shè)【0基礎(chǔ)學(xué)爬蟲】專欄,幫助小白快速入門爬蟲,本期為文件存儲。
概述
前幾期文章中我們已經(jīng)了解到了請求庫、解析庫的使用,已經(jīng)學(xué)會了如何向目標(biāo)網(wǎng)站發(fā)送請求以及解析響應(yīng)信息,那么我們還需要知道如何將數(shù)據(jù)進(jìn)行存儲。數(shù)據(jù)存儲有很多方式,本期會介紹如何將數(shù)據(jù)存入文本文件,如 TXT、JSON、CSV 等。
TXT 文件存儲
介紹
TXT文件存儲是最基本的數(shù)據(jù)存儲方式,TXT 文本文件基本上兼容任何平臺,因此它的應(yīng)用也非常廣泛。使用代碼操作 TXT 文件十分簡單,但是缺點(diǎn)也非常明顯,不利于對數(shù)據(jù)進(jìn)行檢索。
使用
Python 中操作 TXT 文件需要使用到內(nèi)置的 open() 函數(shù)。
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
open() 函數(shù)有七個(gè)參數(shù)分別為:
file:文件路徑
mode:打開方式,默認(rèn)為(r)只讀模式
buffering:文件緩沖
encoding:字符編碼
errors:報(bào)錯(cuò)級別
newline:換行模式,默認(rèn)以\n換行
closefd:控制在關(guān)閉文件時(shí)是否徹底關(guān)閉文件
文件打開方式分為以下幾種:
r:以只讀方式打開文件
w:以寫入方式打開文件。如果文件存在則覆蓋原文件,不存在則新建。
x:創(chuàng)建新文件并以寫入方式打開文件
a:以追加方式打開文件。如果文件存在,則在結(jié)尾位置寫入,不存在則新建。
b:二進(jìn)制模式
t:文本模式
+:讀取與寫入
wb:以二進(jìn)制寫入方式打開文件。如果文件存在則覆蓋原文件,不存在則新建。
w+:以讀寫方式打開文件。如果文件存在則覆蓋原文件,不存在則新建。
wb+:以二進(jìn)制讀寫方式打開文件。如果文件存在則覆蓋原文件,不存在則新建。
ab:以二進(jìn)制追加方式打開文件。如果文件存在,則在結(jié)尾位置寫入,不存在則新建。
ab+:以二進(jìn)制追加讀寫方式打開文件。如果文件存在,則在結(jié)尾位置寫入,不存在則新建。
f = open('data.txt','r',encoding="utf-8")
f.seek(2) #從指定下標(biāo)位置開始讀取
data = f.read()
f.close()
f = open('data.txt','w',encoding="utf-8")
f.write('hello')
f.write(' ')
f.write('world')
f.close()
#hello world
上下文管理器
上文中可以看到,對一個(gè)文件進(jìn)行讀寫操作后需要使用 close() 方法關(guān)閉文件。如果不使用 close() 關(guān)閉文件會導(dǎo)致資源泄露問題。為了避免這個(gè)問題和優(yōu)化代碼,我們可以使用上下文管理器來操作文件。
with open('data.txt','w',encoding='uutf-8')as f:f.write('hello')f.write(' ')f.write('world')
當(dāng) with 語句塊結(jié)束后文件會自動(dòng)關(guān)閉,這樣不需要再調(diào)用 close() 方法。
JSON 文件存儲
介紹
JSON 全稱為 JavaScript Object Notation,也就是 JavaScript 對象標(biāo)記,是一種輕量級的數(shù)據(jù)交換格式。人們可以很容易的對 JSON 格式的數(shù)據(jù)進(jìn)行閱讀和編寫,同時(shí)也方便了機(jī)器進(jìn)行解析和生成。JSON 采用完全獨(dú)立于程序語言的文本格式,但是也使用了類 C 語言的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使 JSON 成為理想的數(shù)據(jù)交換語言。
JSON 通過對象和數(shù)組的組合來表示數(shù)據(jù),而在 JavaScript 中,一切皆為對象,因此任何數(shù)據(jù)類型都可以通過 JSON 來表示。
在 JavaScript 中 JSON 通常以對象或數(shù)組的形式存在。對象形式為被花括號包裹的鍵值對結(jié)構(gòu),如 { key1 : value1, key2 : value2 }
,key表示對象的屬性,value表示對象的值。數(shù)組形式與對象形式的區(qū)別就在于它是被方括號所包裹,如[{ key1 : value1}, {key2 : value2}]
。對象形式與數(shù)組形式可以自由組合,任意嵌套。JSON中字符串類型的數(shù)據(jù)需要以雙引號包圍。
JSON 的這種結(jié)構(gòu)非常簡潔清晰,且結(jié)構(gòu)化程度很高,因而被廣泛使用。
使用
JSON 是一個(gè)數(shù)據(jù)格式,本質(zhì)上是純字符串類型,在 Python 中它可以被轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型,如對象形式可以被轉(zhuǎn)換為字典,數(shù)組類型可以轉(zhuǎn)換為列表。Python 中內(nèi)置了一個(gè)強(qiáng)大的 JSON 庫,通過它可以簡便的實(shí)現(xiàn) JSON 文件的讀寫操作。
JSON 庫提高了四個(gè)方法:
json.dump():將 JSON 對象寫入文件
json.dumps():將Python對象編碼成 JSON 字符串
json.load():從 JSON 文件中讀取數(shù)據(jù)
json.loads():將已編碼的 JSON 字符串解碼為Python對象
下面我們以這段數(shù)據(jù)作為示例:
{"1001": {"name": "張三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}
讀取數(shù)據(jù)
data.json 文件內(nèi)容為示例 JSON 數(shù)據(jù)。
with open('data.json','r',encoding='utf-8')as f:data = f.read()print(type(data))
#輸出:<class 'str'>
可以看到,我們直接從 JSON 文件里面讀取的數(shù)據(jù)是字符串類型,這不利于我們對它進(jìn)行操作,我們可以使用 json.loads() 方法將 JSON 字符串轉(zhuǎn)換為字典類型。
import jsonwith open('data.json','r',encoding='utf-8')as f:data = f.read()print(type(data))
data = json.loads(data)
print(type(data))
#輸出:
#<class 'str'>
#<class 'dict'>
我們也可以使用更加簡潔的寫法,通過 json.load() ,直接對文件操作對象進(jìn)行解析。
import jsondata = json.load(open('data.json',encoding='utf-8'))print(type(data))
#輸出:<class 'dict'>
寫入數(shù)據(jù)
使用 write() 方法寫入文件時(shí),它只能傳入字符串類型的數(shù)據(jù)。因此我們需要將字典數(shù)據(jù)先轉(zhuǎn)換為 JSON 字符串,可以通過 json.dumps() 方法實(shí)現(xiàn)。
import jsondata = {"1001": {"name": "張三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}print(data)
data = json.dumps(data)
print(type(data))
with open('data.json','w',encoding="utf-8")as f:f.write(data)
#輸出:
#<class 'dict'>
#<class 'str'>
當(dāng)然,將數(shù)據(jù)寫入文件也有更加簡便的方法。
import jsondata = {"1001": {"name": "張三","age": 21,"gender": "female"},"1002": {"name": "李四","age": 22,"gender": "male"}
}json.dump(data,open('data.json','w',encoding='utf-8'),indent=2,ensure_ascii=False)
CSV 文件存儲
介紹
CSV 全稱 Comma-Sparated Values(逗號分隔值),它以純文本形式存儲數(shù)據(jù)表格。CSV 文件是一個(gè)字符序列,它由任意數(shù)目的記錄組成,記錄之間以某種換行符分隔。文件的每條記錄由字段和字段值組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。CSV 并不是一種單一的、明確定義的文本格式,它泛指具備以下特征的任何文件:
純文本呢,使用某個(gè)字符集
由記錄組成
每條記錄被分隔符分隔為字段
每條記錄都有相同的字段序列
使用
Python 中提供了一個(gè)內(nèi)置的 csv 庫來對 CSV 文件進(jìn)行操作。
寫入
import csv#writerow默認(rèn)換行,因此需要通過 newline 將換行符設(shè)置為空,避免重復(fù)換行
with open('data.csv','w',encoding='utf-8',newline="") as csvfile:#delimiter:指定分隔符,默認(rèn)為逗號writer = csv.writer(csvfile,delimiter = " ")#寫入一行writer.writerow(['id', 'name', 'age'])writer.writerow(['1001', 'jack', 15])writer.writerow(['1002', 'marin', 22])writer.writerow(['1003', 'alex', 19])#寫入多行writer.writerows([['1004', 'lucy', 23],['1005', 'john', 30]])
csv庫也提供了其它的寫入方法
import csvwith open('data.csv','w',encoding='utf-8',newline="") as csvfile:#字典寫入對象writer = csv.DictWriter(csvfile,fieldnames=['id','name','age'])writer.writeheader()writer.writerow({'id':'1001','name':'jack','age':21})writer.writerow({'id': '1002', 'name': 'marin', 'age': 22})writer.writerows([{'id': '1003', 'name': 'lucy', 'age': 23},{'id': '1004', 'name': 'mike', 'age': 22}])
讀取
import csvwith open('data.csv','r',encoding='utf-8')as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)
總結(jié)
上文中講到了 TXT、JSON、CSV 三種文件的存儲方式,介紹了如何對這些文件進(jìn)行讀寫操作。文本文件存儲的優(yōu)勢在于簡單、方便,適合存儲少量信息,但想要規(guī)范的儲存數(shù)據(jù)的話并不推薦使用文本文件儲存。