一,、txt類(lèi)文本文件的讀寫(xiě)
使用python處理數(shù)據(jù)文件較多,,而且大部分?jǐn)?shù)據(jù)文件保存在文本文件中(例如:‘ .txt ’, ' .json ' 文件)
讀取文本文件的主要步驟分為:a)打開(kāi)目標(biāo)文件; b)獲取文件內(nèi)數(shù)據(jù),; c)關(guān)閉文件
打開(kāi)文件的一般方式為:
f=open(file_name,access_mode = 'r',buffering = -1)
其中 filen_ame即為目標(biāo)文件名,,輸入為字符串形式;access_mode = 'r' 表示執(zhí)行功能 ,?!畆’ 表示讀取(read),;‘w’ 表示寫(xiě)入(write); 'a'表示增加(add),,也是寫(xiě)入的一種,直接在已存在文本數(shù)據(jù)后面新增數(shù)據(jù) ,;buffering = -1指定緩存方式,,-1表示模型緩存,0表示不緩存,,1表示緩存一行,,n表示緩存n行(沒(méi)有特殊性能要求,該參數(shù)不做修改,,直接默認(rèn)即可)
由于文本文件內(nèi)容編碼方式千變?nèi)f化,,很多時(shí)候直接用open()讀寫(xiě)會(huì)出現(xiàn)編碼錯(cuò)誤的問(wèn)題,,例如:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
python代碼里稍不注意就會(huì)出現(xiàn)這樣的錯(cuò)誤,特別是在Linux環(huán)境下,,如果python代碼里面出現(xiàn)中文或者異常符號(hào),,運(yùn)行代碼時(shí)候就會(huì)出現(xiàn)這樣的錯(cuò)誤。此時(shí)可以在代碼的起始位置增加:# code = 'utf-8' 或者 # coding = UTF-8,最佳的處理方式是引入sys模塊,。
sys.setdefaultencoding('utf-8') # utf-8可以根據(jù)需喲更換成其他編碼方式
而基于文本文件讀寫(xiě)遇到這樣的錯(cuò)誤,,則推薦用python的另外一個(gè)模塊codecs.
fw = codecs.open('test1.txt','a','utf-8')
或者使用with來(lái)實(shí)現(xiàn)代碼:
with codecs.open('文件名','a',encoding = 'utf-8') as file:
codecs模塊可以指定一個(gè)編碼打開(kāi)文件,,使用這個(gè)方法打開(kāi)的文件讀取返回的將是unicode,。寫(xiě)入時(shí),如果參數(shù) 是unicode,,則使用open()時(shí)指定的編碼進(jìn)行編碼后寫(xiě)入,;如果是str,則先根據(jù)源代碼文件聲明的字符編碼,,解碼成unicode后再進(jìn)行前述 操作,。相對(duì)內(nèi)置的open()來(lái)說(shuō),這個(gè)方法比較不容易在編碼上出現(xiàn)問(wèn)題,。
一下是幾種常見(jiàn)的文本文件讀取數(shù)據(jù)代碼:
# 方法一 : read(),直接將整個(gè)文本內(nèi)的數(shù)據(jù)讀取到一個(gè)字符串中,。讀取整個(gè)文本時(shí)候可以,但是讀取多行多列數(shù)據(jù)的時(shí)候不推薦,。 with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打開(kāi)文件 data = file.read() # 讀取數(shù)據(jù),,data為整個(gè)文本文件里面的內(nèi)容,為字符串形式,。 file.close() # 關(guān)閉文件 # 方法二 : readline(),一行一行的讀取,,這種操作在以行為單位的數(shù)據(jù)讀取時(shí)候比較方便,適合較大數(shù)據(jù)文件 with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打開(kāi)文件 data_i = file.readline() # 讀取第i行的數(shù)據(jù),,fata_i即為第i行數(shù)據(jù),,是字符串形式,可以進(jìn)行數(shù)據(jù)處理 file.close() # 關(guān)閉文件 # 方法三 : readlines(),直接讀取整個(gè)文本文件數(shù)據(jù)形成一個(gè)list,每一行數(shù)據(jù)對(duì)應(yīng)list中的一個(gè)元素(字符串形式) with codecs.open('test.txt','r',encoding = 'utf-8') as file: # 打開(kāi)文件 data = file.readlines() # data 為一個(gè)list,,每個(gè)元素是一行的數(shù)據(jù) data_i.rstrip('\n') # data_i為第i行數(shù)據(jù)是一個(gè)字符串,,但是結(jié)尾后換行符'\n',需要去掉,。 file.close() # 關(guān)閉文件
文本文件的寫(xiě)入有兩種情況,,分為一次性寫(xiě)入與逐行寫(xiě)入。
# 寫(xiě)入的方式有兩種,,一種是一次性寫(xiě)入,,一種是逐行寫(xiě)入,在后面增加新內(nèi)容 with codecs.open('test.txt','w',encoding = 'utf-8') as file: file.write('數(shù)據(jù)內(nèi)容或者變量') # 方法二 :逐行寫(xiě)入,,增加新內(nèi)容,,適用于循環(huán)條件下 with codecs.open('test.txt','a',encoding = 'utf-8') as file: file.write('每次循環(huán)的數(shù)據(jù)')
Json文件是一種特殊的文本文件,,寫(xiě)入方法并不是write,而是json.dump()
with codecs.open('test.json','a',encoding = 'utf-8') as file: json.dump(list,file,ensure_ascii = False,indent = 2) # ensure_ascii = False 指定輸出為中文,,否則輸出為編碼 # indent = 2 是指定每個(gè)字之間的間距
二,、 excel文件的讀寫(xiě)
test.xlsx
ID |
Name |
age |
scors |
101 |
Tom |
12 |
9 |
102 |
Lucy |
14 |
|
103 |
Tomas |
|
7 |
104 |
Anna |
16 |
|
105 |
Andy |
|
|
106 |
Jack |
12 |
5 |
107 |
Dave |
|
6 |
201 |
Hiton |
10 |
7 |
206 |
Ben |
15 |
10 |
203 |
Joy |
14 |
|
如表格test.xlsx所示,我需要讀取表格內(nèi)部數(shù)據(jù)信息,,但我特意部分信息缺失,。列表操作有很多,例如:
a)獲取excel文件中所有表格
b)根據(jù)表格獲取對(duì)應(yīng)表格內(nèi)的數(shù)據(jù)信息
c)獲取表格的行數(shù),,列數(shù)
d)整行或者整列的切片處理
e)獲取指定位置的數(shù)據(jù)內(nèi)容
workbook = xlrd.open_workbook(r'./test.xlsx') sheet = workbook.sheet_names() print(sheet) # 輸出為['class_one'],是一個(gè)list類(lèi)型,,每一個(gè)元素對(duì)應(yīng)一個(gè)表名 # b)根據(jù)表格索引或者名稱(chēng)獲取對(duì)應(yīng)表格內(nèi)的數(shù)據(jù)信息 data1 = workbook.sheet_by_index(0) data2 = workbook.sheet_by_name(sheet[0]) print(num_row) # 輸出為11,,該方式讀取將列名一起讀入,,如果要對(duì)數(shù)據(jù)進(jìn)行處理,第一行數(shù)據(jù)需要去除 data_row = data1.row_values(0) print(data_row) # 輸出['ID','Name','age','scors']為一個(gè)list類(lèi)型,每個(gè)元素為一個(gè)字符串 data_col = data2.col_values(0) print(data_col) # 輸出['ID','101','102','103','104','105','106','107','201','206','203'] # e)獲取指定位置的數(shù)據(jù)內(nèi)容 print(data1.cell(2,1)) # 輸出第三行第二列的數(shù)據(jù)信息 text:'Lucy' print(data2.cell(2,1).value) # 輸出第三行第二列的數(shù)據(jù)內(nèi)容 Lucy
對(duì)excel文件的寫(xiě)入操作:
file = Workbook(encoding = 'utf-8') #指定file以u(píng)tf-8的格式打開(kāi) table = file.add_sheet('data') #for循環(huán)指定取出key值存入num中 #字典數(shù)據(jù)取出后無(wú)需,,需要先排序 #for循環(huán)將data字典中的鍵和值分批的保存在ldata中 for i,p in enumerate(ldata): #將數(shù)據(jù)寫(xiě)入文件,i是enumerate()函數(shù)返回的序號(hào)數(shù)
三,、 CVS文件讀寫(xiě)
cvs文件也是常用的數(shù)據(jù)文件形式之一,讀取一般有兩種,,python自帶的cvs模塊,,以及pandas里面的讀取工具。在這里介紹一下python自帶模塊,,pandas工具相當(dāng)強(qiáng)大,后面統(tǒng)一整理,。
CVS讀取代碼:
cvs_file = open('test.cvs','r') file = cvs.reader(cvs_file) # 獲得一個(gè)List,,每一個(gè)元素為一行
CVS寫(xiě)入代碼:
out = open('test.csv','a', newline='') # newline =''是為了避免出現(xiàn)空行問(wèn)題 csv_write = csv.writer(out,dialect='excel') # 指定文件類(lèi)型為excel類(lèi)型 csv_write.writerow('寫(xiě)入內(nèi)容')
四、 mat文件的讀寫(xiě)
data = scipy.io.loadmat('matData.mat') # 讀取mat文件 print(data.keys()) # 查看mat文件中的所有變量,,因?yàn)橥粋€(gè)mat文件中可能有多個(gè)變量的內(nèi)容 matrix1 = data['matrix1'] matrix2 = data['matrix2'] scipy.io.savemat('matData2.mat',{'matrix1':matrix1, 'matrix2':matrix2}) # 寫(xiě)入mat文件 # matData2.mat為生成的文件名,,{ }內(nèi)的內(nèi)容為鍵值對(duì)——變量名:變量
|