第七章 文件和數(shù)據(jù)格式化
7.1 文件的使用
文件時存儲在輔助存儲器上的一組數(shù)據(jù)序列,可以包含任何數(shù)據(jù)內(nèi)容。概念上,文件是數(shù)據(jù)的集合和抽象。文件包括文本文件和二進制文件兩種類型。
7.1.1 文件的類型
文本文件一般由單一特定編碼的字符組成,如UTF-8編碼,內(nèi)容容易統(tǒng)一展示和閱讀。
二進制文件直接由比特0和比特1組成,沒有統(tǒng)一的字符編碼,文本內(nèi)部數(shù)據(jù)的組織格式與文件用途有關(guān)。二進制是信息按照非字符但有特定格式形成的文件,例如png格式的圖片文件、avi格式的視頻文件。
二進制文件和文本文件最主要的區(qū)別在于是否有統(tǒng)一的字符編碼。
無論文件創(chuàng)建為文本文件或者二進制文件,都可以用“文本文件方式”和“二進制文件方式”打開,但打開后的操作不同。
# 一個文本文件,其內(nèi)容為“計算機等級考試”,采用文本方式打開
# 注意:文本文件與Python程序文件放在同一個目錄下
file = open("1.txt", mode="rt", encoding="UTF-8")
read_content = file.readline()
print(read_content)
file.close()
# 運行結(jié)果
計算機等級考試
# 一個文本文件,其內(nèi)容為“計算機等級考試”,采用二進制方式打開
file = open("1.txt", mode="rb")
read_content = file.readline()
print(read_content)
file.close()
# 運行結(jié)果
b'\xe8\xae\xa1\xe7\xae\x97\xe6\x9c\xba\xe7\xad\x89\xe7\xba\xa7\xe8\x80\x83\xe8\xaf\x95'
采用文本方式讀入文件,文件經(jīng)過編碼形成字符串,打印出有含義的字符;采用二進制方式打開文件,文件被解析為字節(jié)流。由于存在編碼,字符串中的一個字符由多個字節(jié)表示。
7.1.2 文件的打開和關(guān)閉
Python對文本文件和二進制文件采用統(tǒng)一的操作步驟,即”打開—操作—關(guān)閉“,如下圖所示。操作系統(tǒng)中的文件默認(rèn)處于存儲狀態(tài),首先需要將其打開,使得當(dāng)前程序有權(quán)操作這個文件,打開不存在的文件系統(tǒng)可以創(chuàng)建這個文件。打開后的文件處于占用狀態(tài),此時,另一個進程不能操作這個文件??梢酝鲆唤M方式讀取文件的內(nèi)容或向文件寫入內(nèi)容,操作之后需要將文件關(guān)閉,關(guān)閉將釋放對文件的控制是文件恢復(fù)或存儲狀態(tài),此時,另一個進程能夠操作文件。
Python通過open()函數(shù)打開一個文件,并返回一個操作這個文件的變量,語法格式如下:
<變量名> = open(<文件路徑及文件名>,<打開模式>)
open()函數(shù)提供7種基本的打開模式:
打開模式 | 含義 |
---|---|
r | 只讀模式,如果文件不存在,返回異常FileNotFoundError,默認(rèn)值 |
w | 覆蓋寫模式,文件不存在則創(chuàng)建,存在則完全覆蓋原文件 |
x | 創(chuàng)建寫模式,文件不存在則創(chuàng)建,存在則返回異常FileExistsError |
a | 追加寫模式,文件不存在則創(chuàng)建,存在則在原文件最后追加內(nèi)容 |
b | 二進制文件模式 |
t | 文本文件模式,默認(rèn)值 |
+ | 與/r/w/x/a一同使用,在原功能基礎(chǔ)上增加同時讀寫功能 |
打開模式使用字符串方式表示,根據(jù)字符串定義,單引號或者雙引號均可。上述打開模式中,‘x’、‘w’、‘x’、‘a(chǎn)’可以和‘b’、‘t’、‘+’組合使用,形成既表達讀寫又表達文件模式的方式。
打開文件有一些常用組合,使用方式如下:
# 以文本方式只讀打開一個文件,讀入后不能對文件進行修改
<變量名> = open(<文件名>, 'r') 或 <變量名> = open(<文件名>)
# 以文本方式可讀寫的打開一個文件,可以讀入并修改文件
<變量名> = open(<文件名>, 'r+')
# 以文本方式打開一個空文件,準(zhǔn)備寫入一批內(nèi)容,并保存為新文件
<變量名> = open(<文件名>, 'w')
# 以文本方式打開一個空文件或已有的文件,追加形式寫入一批內(nèi)容,更新原文件
<變量名> = open(<文件名>, 'a+')
# 以二進制方式只讀打開一個文件,讀入后不能對文件進行修改
<變量名> = open(<文件名>, 'rb')
文件試用結(jié)束后要用close()方法關(guān)閉,釋放文件的使用授權(quán),語法格式如下:
<變量名>.close()
7.1.3 文件的讀寫
根據(jù)打開方式不同,文件讀寫也會根據(jù)文本文件或二進制打開方式有所不同。
常用的文件讀取方法如下:
方法 | 含義 |
---|---|
f.read(size=-1) | 從文件中讀入整個文件內(nèi)容,參數(shù)可選。如果給出,讀入前size長度的字符串或字節(jié)流 |
f.readline(size=-1) | 從文件中讀入一行內(nèi)容,參數(shù)可選。如果給出,讀入該行size長度的字符串或字節(jié)流 |
f.readlines(hint=-1) | 從文件中讀入所有行,以每行為元素形成一個列表。參數(shù)可選,如果給出,讀入hint行 |
f.seek(offset) | 改變當(dāng)前文件操作指針的為啥,offset的值:0為文件開頭,2為文件結(jié)尾 |
從文本文件逐行讀入內(nèi)容并進行處理是一個基本的文件操作需求。文本文件可以看成是由行組成的組合類型,因此,可以使用遍歷循環(huán)逐行遍歷文件,語法格式如下:
file = open(<文件路徑及名稱>, "r")
for line in file:
print(line) # 處理一行數(shù)據(jù)
f.close
常用的文件寫入方法如下:
方法 | 含義 |
---|---|
f.write(s) | 向文件寫入一個字符串或字節(jié)流 |
f.writelines(lines) | 將一個元素為字符串的列表整體寫入文件 |
f.write(s)向文件寫入字符串s,每次寫入后,將會記錄一個寫入指針。放方法可以反復(fù)調(diào)用,再寫入指針后分批寫入內(nèi)容,直至文件被關(guān)閉。
使用f.write(s)時,要顯示的使用’\n’對寫入文本進行分行,如果不進行分行,每次寫入的字符串會被連接起來。
f = open("c.txt", "w")
f.write('新年都未有芳華\n')
f.write('二月初驚見草芽\n')
f.write('白雪卻嫌春色晚\n')
f.write('故穿庭樹作飛花\n')
f.close()
f.writelines(lines)直接將列表類型的個元素連接起來寫入文件f
ls = ['新年都未有芳華\n','二月初驚見草芽\n','白雪卻嫌春色晚\n','故穿庭樹作飛花\n']
f = open("c.txt", "w")
f.writelines(ls)
f.close()
上述代碼運行結(jié)果皆為:
新年都未有芳華
二月初驚見草芽
白雪卻嫌春色晚
故穿庭樹作飛花
7.2 數(shù)據(jù)組織的維度
一組數(shù)據(jù)在被計算機處理前需要進行一定的組織,表面數(shù)據(jù)之間的基本關(guān)系,進而形成”數(shù)據(jù)的維度“。根據(jù)數(shù)據(jù)的關(guān)系不同,數(shù)據(jù)組織可以分為:一維數(shù)據(jù)、二維數(shù)據(jù)和高維數(shù)據(jù)。
7.2.1 一維數(shù)據(jù)
一維數(shù)據(jù)由對等關(guān)系的有序或無需數(shù)據(jù)構(gòu)成,采用線性方式組織,對應(yīng)于數(shù)學(xué)中數(shù)組的概念。例如:中國的直轄市列表即可表示為一維數(shù)據(jù),一維數(shù)據(jù)具有線性特點。
7.2.2 二維數(shù)據(jù)
二維數(shù)據(jù),也稱表格數(shù)據(jù),有關(guān)聯(lián)關(guān)系數(shù)據(jù)構(gòu)成,采用二維表格方式組織,對應(yīng)于數(shù)學(xué)中的矩陣,常見的表格都屬于二維數(shù)據(jù)。例如:國家統(tǒng)計局發(fā)布的居民消費價格指數(shù)是二維數(shù)據(jù)。
7.2.3 高維數(shù)據(jù)
高維數(shù)據(jù)由鍵值對類型的數(shù)據(jù)構(gòu)成,采用對象方式組織,可以多層嵌套。
高維數(shù)據(jù)在Web系統(tǒng)中十分常用,作為當(dāng)今Internet組織內(nèi)容的主要方式,高維數(shù)據(jù)衍生出HTML、XML、JSON等具體數(shù)據(jù)組織的語法結(jié)構(gòu)。
7.3 一維數(shù)據(jù)的處理
7.3.1 一維數(shù)據(jù)的表示
一維數(shù)據(jù)是最簡單的數(shù)據(jù)組織類型,由于是線性結(jié)構(gòu),在Python語言中主要采用列表形式表示。
一維數(shù)據(jù)的文件存儲有多種方式,總體思路是采用特殊字符分隔各數(shù)據(jù)。采用存儲方法包括4種:
(1)采用空格分隔元素,例如:
北京 上海 天津 重慶
(2)采用逗號分隔元素,例如:
北京,上海,天津,重慶
(3)采用換行分隔元素,例如:文章來源:http://www.zghlxwxcb.cn/news/detail-468063.html
北京
上海
天津
重慶
(4)其他特殊符號分隔,以分號分隔為例,例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-468063.html
到了這里,關(guān)于第七章 文件和數(shù)據(jù)格式化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!