Python編程基礎(chǔ)與應(yīng)用第10章 文件與數(shù)據(jù)格式化_第1頁
Python編程基礎(chǔ)與應(yīng)用第10章 文件與數(shù)據(jù)格式化_第2頁
Python編程基礎(chǔ)與應(yīng)用第10章 文件與數(shù)據(jù)格式化_第3頁
Python編程基礎(chǔ)與應(yīng)用第10章 文件與數(shù)據(jù)格式化_第4頁
Python編程基礎(chǔ)與應(yīng)用第10章 文件與數(shù)據(jù)格式化_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

10

文件與數(shù)據(jù)格式化XXXX

大學(xué)XX

學(xué)院XXX

教授2學(xué)習(xí)目標(biāo):熟悉字符編碼掌握文件操作熟悉數(shù)據(jù)存儲(chǔ)格式思政內(nèi)涵:通過對(duì)字符編碼、文件安全的學(xué)習(xí),廣大學(xué)子要增強(qiáng)數(shù)據(jù)安全、網(wǎng)絡(luò)安全和國家安全意識(shí)。0

文件與數(shù)據(jù)格式化310.1 文件文件概述文件定義文件在計(jì)算機(jī)中應(yīng)用廣泛,計(jì)算機(jī)中的文件是以硬盤等外部介質(zhì)為載體,存儲(chǔ)在計(jì)算機(jī)中的數(shù)據(jù)的集合,文本文檔、圖片、程序、音頻等都是文件。計(jì)算機(jī)中的每個(gè)文件都有唯一確定的標(biāo)識(shí),以便識(shí)別和引用文件。文件標(biāo)識(shí)分為路徑、文件名主干和擴(kuò)展名

3

個(gè)部分,Windows

操作系統(tǒng)中一個(gè)文件的完整標(biāo)識(shí)如下。D:\python\chapter11\example.py操作系統(tǒng)以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理,若想找到存放在外部介質(zhì)上的數(shù)據(jù),就必須先按照文件標(biāo)識(shí)找到指定的文件,再從文件中讀取數(shù)據(jù)。根據(jù)以上文件完整標(biāo)識(shí),可以找到

Windows

操作系統(tǒng)D:\python\chapter11

路徑下文4件名主干為example、擴(kuò)展名為.py

的Python

源代碼文件。根據(jù)數(shù)據(jù)的邏輯存儲(chǔ)結(jié)構(gòu),人們將計(jì)算機(jī)中的文件分為文本文件和二進(jìn)制文件。文本文件專門用于存儲(chǔ)文本字符數(shù)據(jù),若一個(gè)文件中沒有包含除文本字符外的其他數(shù)據(jù),就認(rèn)為它是一個(gè)文本文件。文本文件可以直接使用文字處理程序(如記事本)打開并正常閱讀。二進(jìn)制文件是人們根據(jù)計(jì)算機(jī)中數(shù)據(jù)的邏輯存儲(chǔ)結(jié)構(gòu)為文件劃分的類別之一,計(jì)算機(jī)中存儲(chǔ)的圖像、音頻、視頻、可執(zhí)行文件等都屬于二進(jìn)制文件,這類文件不能直接使用文字處理程序正常讀寫,必須使用專用程序才能正確獲取文件信息。本質(zhì)上,計(jì)算機(jī)中的數(shù)據(jù)在物理層面都是以二進(jìn)制形式存儲(chǔ)的。Python

與其他編程語言一樣,也具有操作文件(I/O)的能力,如打開文件、讀取和追加數(shù)據(jù)、插入和刪除數(shù)據(jù)、關(guān)閉文件、刪除文件等。0

文件與數(shù)據(jù)格式化52.

字符編碼字符編碼就是將中文、英文等符號(hào)映射成數(shù)字,然后將數(shù)字轉(zhuǎn)換為計(jì)算機(jī)能存儲(chǔ)的二進(jìn)制數(shù)。常見的編碼有

ASCII

編碼、GB2312

編碼、GBK

編碼、unicode

編碼和UTF-8

編碼。

ASCII

編碼由于計(jì)算機(jī)是美國人發(fā)明的,因此最初只有

127

個(gè)字符被編碼到計(jì)算機(jī)里,包括大小寫英文字母、數(shù)字和一些符號(hào),這個(gè)編碼表被稱為ASCII

編碼,用單字節(jié)的二進(jìn)制位表示。例如,大寫字母A

的編碼是

65,小寫字母z

的編碼是122。當(dāng)編程只涉及英文字符或數(shù)字,不涉及中文字符時(shí),可以使用

ASCII

編碼。

GB2312

編碼與GBK

編碼當(dāng)用計(jì)算機(jī)處理中文字符時(shí),顯然一個(gè)字節(jié)的編碼是不夠的,至少需要兩個(gè)字節(jié),而且還不能和ASCII

編碼沖突,因此,中國制定了GB2312

編碼,用來把中文編進(jìn)去。GB

為國標(biāo),GBK

表示國標(biāo)擴(kuò)展。GB2312

兼容ASCII

編碼,6對(duì)于ASCII

可以表示的字符(如英文字符A、B

等),在

GB2312

中的編碼和ASCII編碼一致,占一個(gè)字節(jié);對(duì)于ASCII

不能表示的字符,GB2312

用兩個(gè)字節(jié)表示,且最高位不為

0,避免與ASCII

字符沖突。例如,字母A

在GB2312

中存儲(chǔ)的字節(jié)十六進(jìn)制為

41,在ASCII

中也是

41,中文字符“中”在GB2312

中存儲(chǔ)的兩個(gè)字節(jié)十六進(jìn)制為D6D0,最高位為

1

不為

0。GB2312

只收錄了

6763

個(gè)漢字,GBK

屬于GB2312

的擴(kuò)展,增加了很多漢字,支持繁體字,同時(shí)兼容GB2312,同樣用兩個(gè)字節(jié)表示非ASCII

字符。3)

unicode

編碼世界上的語言很多,如果各自采用獨(dú)立的編碼方式,就很容易出現(xiàn)亂碼問題。unicode

可以把所有語言都統(tǒng)一到一套編碼中,從而解決了亂碼問題。unicode

將世界上的所有字符映射為唯一的數(shù)字。然而,unicode

數(shù)字并不能直接轉(zhuǎn)換為二進(jìn)制存儲(chǔ)。有兩種方法可以將unicode

數(shù)字轉(zhuǎn)換為二進(jìn)制位的映射:一種是將每個(gè)unicode

數(shù)字用固定寬度的二進(jìn)制位表示,如都用兩個(gè)字節(jié)0

文件與數(shù)據(jù)格式化7表示,由此產(chǎn)生了ASCII、GB2312、GBK

編碼,例如,字母A

的ASCII

編碼是十進(jìn)制的

65,對(duì)應(yīng)的二進(jìn)制表示為

01000001,而在

unicode

編碼中,只需要在前面補(bǔ)

0

就可以,因此,A

的unicode

編碼是

00000000

01000001;另一種是存儲(chǔ)的二進(jìn)制位除了表示數(shù)字之外,還表示每個(gè)unicode

數(shù)字的長度,由此產(chǎn)生了UTF-8

編碼。4)

UTF-8

編碼UTF(unicode

transformation

format,統(tǒng)一碼轉(zhuǎn)換格式)是為

unicode

編碼設(shè)計(jì)的一種在存儲(chǔ)和傳輸時(shí)節(jié)省空間的編碼方案,主要包括

UTF-32、UTF-16和UTF-8。UTF-32

使用

4

個(gè)字節(jié)表示所有字符;UTF-16

使用

2、4

個(gè)字節(jié)表示所有字符,優(yōu)先使用

2

個(gè)字節(jié),如果無法表示則使用

4

個(gè)字節(jié);UTF-8

使用1、2、3、4

個(gè)字節(jié)表示所有字符,優(yōu)先使用

1

個(gè)字節(jié),若無法滿足則增加一個(gè)字節(jié),最多

4

個(gè)字節(jié),英文占

1

個(gè)字節(jié)、歐洲語系字符占

2

個(gè)字節(jié)、東亞字符占

3

個(gè)字節(jié),其他及特殊字符占

4

個(gè)字節(jié)。UTF-8

編碼把unicode

編碼轉(zhuǎn)換為8“可變長編碼”,常用的英文字母被編碼成

1

個(gè)字節(jié),漢字通常是

3

個(gè)字節(jié)。當(dāng)傳輸?shù)奈谋景罅坑⑽淖址麜r(shí),用UTF-8

編碼可以有效地節(jié)省空間。在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用unicode

編碼,當(dāng)需要保存到硬盤或進(jìn)行傳輸時(shí),就轉(zhuǎn)換為UTF-8

編碼。字母“A”和中文“中”的編碼如表

10-1

所示。表

10-1 字母“A”和中文“中”的編碼字符ASCIIunicodeUTF-8A01000001000000000100000101000001中x010011100010110111100100

1011100010101101Python

編碼及其轉(zhuǎn)換的示例代碼如程序段P10.1

所示。0

文件與數(shù)據(jù)格式化9P10.1

字符編碼# ord

獲取字符的unicode

十進(jìn)制編碼# 輸出十進(jìn)制編碼# 輸出二進(jìn)制編碼# ord

獲取字符的unicode

十進(jìn)制編碼# 輸出十進(jìn)制編碼#輸出二進(jìn)制編碼m=ord('A')print(m)print(bin(m))n=ord('中')print(n)print(bin(n))print(chr(65))print(chr(20013))運(yùn)行代碼,輸出結(jié)果如下。650b100000110200130b100111000101101A中文件打開與關(guān)閉open

打開文件在對(duì)文件進(jìn)行操作之前,需要把文件從硬盤讀取到內(nèi)存中,并指定文件放在內(nèi)存的哪個(gè)位置,這就是文件的打開。Python

中通過內(nèi)置函數(shù)open()打開文件,實(shí)際上通過open()函數(shù)創(chuàng)建了文件對(duì)象,該函數(shù)的語法格式如下。open(file,mode='r',encoding=None)open()函數(shù)中的參數(shù)file

用于接收文件名或文件路徑;參數(shù)

encoding

用0

文件與數(shù)據(jù)格式化11于指定文件的編碼格式;參數(shù)mode

用于設(shè)置文件的打開模式,常用的打開模式有r、w、a,這些模式的含義分別如下。

r:以只讀的方式打開文件,參數(shù)mode

的默認(rèn)值。w:以只寫的方式打開文件。a:以追加的方式打開文件。以上模式可以單獨(dú)使用,也可以與模式

b、模式+搭配使用。其中,模式

b表示以二進(jìn)制方式打開文件,模式+表示以更新的方式打開文件。常用的文件打開模式及其搭配如表

10-2

所示。表

10-2 常用的文件打開模式及其搭配打開模式名稱功能描述t文本模式

(默認(rèn))以文本文件方式打開文件b二進(jìn)制模式以二進(jìn)制文件方式打開文件12r/rb只讀模式(默認(rèn))以只讀方式打開文件,文件指針放在文件的開頭w/wb只寫模式如果該文件已存在則打開文件,并從頭開始編輯,原有內(nèi)容會(huì)被刪除。如果該文件不存在,則創(chuàng)建新文件a/ab追加模式如果該文件已存在,文件指針放在文件結(jié)尾,新的內(nèi)容會(huì)被寫入已有內(nèi)容之后。如果該文件不存在,則創(chuàng)建新文件進(jìn)行寫入r+/rb+讀取(更新)模式以讀/寫方式打開文件,若文件不存在,則打開文件失敗w+/wb+寫入(更新)模式以讀/寫方式打開文件,若文件已存在,則重寫文件a+/ab+追加(更新)模式以讀/寫方式打開文件,只允許在末尾追加數(shù)據(jù),若文件不存在,則創(chuàng)建新文件0

文件與數(shù)據(jù)格式化13若

open()函數(shù)調(diào)用成功,則返回一個(gè)文件對(duì)象,文件對(duì)象具有與該文件相關(guān)的屬性和方法,可以查看文件對(duì)象的屬性,并可用文件對(duì)象方法操作文件。文件對(duì)象的相關(guān)屬性如表

10-3

所示。表

10-3 文件對(duì)象的相關(guān)屬性屬性功能描述name打開文件的名稱mode打開文件的訪問模式closed文件關(guān)閉則返回True,否則返回False2.

close

關(guān)閉文件在打開并操作完文件之后,就應(yīng)該及時(shí)將其關(guān)閉,否則程序的運(yùn)行可能會(huì)出現(xiàn)問題。文件對(duì)象的

close()方法用于刷新任何未寫入的信息并關(guān)閉文件對(duì)象,之后便不能再進(jìn)行寫入操作。當(dāng)文件的引用對(duì)象重新分配給另一個(gè)文件時(shí),14Python

也會(huì)自動(dòng)關(guān)閉一個(gè)文件,但使用close()方法關(guān)閉文件是良好的編程習(xí)慣。通過文件對(duì)象的close()方法關(guān)閉文件的語法格式如下。file_object.close()其中,file_object

是文件對(duì)象。打開與關(guān)閉文件的示例代碼如程序段

P10.2所示。P10.2

打開與關(guān)閉文件f=open("test.txt",

"w")f.write("Pythonisagreat

language.")print()print(f.mode)print(f.closed)f.close()0

文件與數(shù)據(jù)格式化15print(f.closed)運(yùn)行代碼,輸出結(jié)果如下。test.txtwFalseTrue程序執(zhí)行后,輸出了文件的名稱、打開方式及是否關(guān)閉等信息,在當(dāng)前文件目錄下會(huì)創(chuàng)建test.txt

文件,用記事本打開文件,可以看到以下文件內(nèi)容。Pythonisagreat

language.3.

with-as

語句打開/關(guān)閉文件在任何一門編程語言中,文件的輸入輸出都是很常見的資源管理操作。但16資源是有限的,必須保證資源在使用過后得到釋放,不然就容易造成資源泄露,輕則使得系統(tǒng)處理緩慢,嚴(yán)重時(shí)會(huì)使系統(tǒng)崩潰。前面介紹的close()關(guān)閉文件操作,如果在打開文件或文件操作過程中拋出了異常,則無法及時(shí)關(guān)閉文件。在Python

中,對(duì)應(yīng)的解決方式是使用

with-as

語句操作上下文管理器(contextmanager),它能夠自動(dòng)分配并釋放資源。然而,并不是所有的對(duì)象都可以使用with

語句,只有支持上下文管理協(xié)議的對(duì)象才可以。目前,支持該協(xié)議的對(duì)象有文件(file)、線程(threading)等。上下文管理器就是包含

enter

()和

exit

()方法的對(duì)象,使用with-as打開的文件對(duì)象就是一個(gè)上下文管理器,無論期間是否拋出異常,都能保證with-as

語句執(zhí)行完畢后自動(dòng)關(guān)閉已經(jīng)打開的文件。with-as

語句的語法格式如下。with

表達(dá)式

[as

target]:代碼塊0

文件與數(shù)據(jù)格式化17其中,target

參數(shù)用于指定一個(gè)變量,該語句會(huì)將表達(dá)式指定的結(jié)果保存到該變量中,其中的代碼塊如果不想執(zhí)行任何語句,則可以直接使用pass

語句代替。示例代碼如程序段P10.3

所示。P10.3

with-as

語句打開文件withopen("test.txt","w")as

f:f.write("Pythonisagreat

language.")print()print(f.mode)print(f.closed)print(f.closed)運(yùn)行代碼,輸出結(jié)果如下。test.txt18wFalseTrue程序執(zhí)行后,在with-as

代碼塊中輸出的文件對(duì)象屬性顯示未關(guān)閉,退出代碼塊后輸出的文件對(duì)象屬性顯示文件已關(guān)閉。with-as

語句預(yù)定義了清理操作,實(shí)現(xiàn)了文件的自動(dòng)關(guān)閉。4.

上下文管理器前面在介紹with

語句時(shí),提到了一個(gè)非常重要的概念——上下文管理器。使用with

語句的前提就是要有上下文管理器。上下文管理器用于規(guī)定某個(gè)對(duì)象的使用范圍,一旦進(jìn)入或離開使用范圍,就會(huì)有特殊的操作被調(diào)用。1)

上下文管理協(xié)議上下文管理協(xié)議包含

enter

()和

exit

()方法,支持該協(xié)議的對(duì)象要實(shí)0

文件與數(shù)據(jù)格式化19現(xiàn)這兩個(gè)方法。關(guān)于這兩個(gè)方法的介紹如下。

enter

(self):在進(jìn)入上下文管理器時(shí)調(diào)用此方法,其返回值被放入with-as

語句中as

說明符指定的變量中。

exit

(self,type,value,tb):在離開上下文管理器時(shí)調(diào)用此方法。如果出現(xiàn)了異常,則type、value、tb

分別為異常的類型、值和追蹤信息;如果沒有出現(xiàn)異常,3

個(gè)參數(shù)均設(shè)為None。此方法返回值為

True

或False,分別指示被引發(fā)的異常有沒有得到處理,如果返回False,則引發(fā)的異常會(huì)被傳遞出上下文。2)

上下文管理器原理上下文管理器是指支持上下文管理協(xié)議的對(duì)象,用于實(shí)現(xiàn)

enter

()和

exit

()方法。上下文管理器定義了執(zhí)行with

語句時(shí)要建立的運(yùn)行時(shí)上下文,負(fù)責(zé)執(zhí)行with

語句塊上下文中的進(jìn)入與退出操作。3)

運(yùn)行時(shí)上下文20運(yùn)行時(shí)上下文是指代碼執(zhí)行的環(huán)境和狀態(tài)信息。由上下文管理協(xié)議的對(duì)象通過

enter

()方法進(jìn)入上下文,通過

exit

()方法退出上下文。4)

上下文表達(dá)式上下文表達(dá)式是指with

語句中位于關(guān)鍵字with

之后的表達(dá)式,該表達(dá)式要返回一個(gè)支持上下文管理協(xié)議的對(duì)象。在了解了上下文管理器之后,就能很好地理解with

語句的整個(gè)執(zhí)行過程了,具體如下。首先執(zhí)行上下文表達(dá)式,生成一個(gè)上下文管理器對(duì)象。調(diào)用上下文管理器的

enter

()方法,如果使用了as

子句,就把

enter

()方法的返回值賦值給as

子句中的資源對(duì)象。執(zhí)行with

語句包裹的代碼塊。無論在執(zhí)行的過程中是否發(fā)生異常,都會(huì)執(zhí)行上下文管理器的

exit

()方法,該方法負(fù)責(zé)執(zhí)行程序的“清理”工作,如釋放資源等。0

文件與數(shù)據(jù)格式化21(5)

如果在執(zhí)行的過程中沒有出現(xiàn)異常,或者代碼中執(zhí)行了break、continue

或return

語句,則以None

作為參數(shù)調(diào)用

exit

()方法;如果在執(zhí)行的過程中出現(xiàn)了異常,則會(huì)使用sys.exc_info

得到的異常信息作為參數(shù)調(diào)用

exit

()方法。(6)

在出現(xiàn)異常時(shí),如果

exit

()方法返回的結(jié)果為False,則會(huì)重新拋出異常,讓

with

之外的語句邏輯來處理異常,這是通用做法;如果返回

True,則忽略異常,不再對(duì)異常進(jìn)行處理。在開發(fā)中,也可以自己定義上下文管理器,只需要讓它支持上下文管理協(xié)議,并實(shí)現(xiàn)該協(xié)議規(guī)定的

enter

()和

exit

()方法即可。示例代碼如程序段P10.4

所示。P10.4

自定義上下文管理器class

MyContext(object):def

enter

(self):22print('

enter

()

called')return

selfdef

description(self):print('mynameis

MyContestManager')def

exit

(self,e_t,e_v,t_b):print('

exit

()

called')withMyContext()as

a:a.description()print('ais

called')運(yùn)行代碼,輸出結(jié)果如下。

enter

()

calledmynameis

MyContestManager0

文件與數(shù)據(jù)格式化23ais

called

exit

()

called從輸出結(jié)果可知,使用

with

語句,在生成上下文管理器之后,先調(diào)用了該對(duì)象的

enter

()

方法,然后執(zhí)行語句體,最后執(zhí)行上下文管理器的

exit

()方法。10.1.3 文件讀寫Python

提供了一系列操作文件的方法,表

10-4

列出了文件的常用操作方法。表

10-4 文件的常用操作方法方法功能描述read()從文件讀取指定的字節(jié)數(shù),如果未給定或?yàn)樨?fù)則讀取所有readline()讀取整行,包括

"\n"

字符24readlines()讀取所有行并返回列表write()將字符串寫入文件,返回的是寫入的字符長度writelines()向文件寫入一個(gè)序列字符串列表,如果需要換行則要加入每行的換行符tell()返回文件當(dāng)前位置seek()移動(dòng)文件讀取指針到指定位置flush()刷新文件內(nèi)部緩沖,直接把內(nèi)部緩沖區(qū)的數(shù)據(jù)立刻寫入文件isatty()如果文件連接到一個(gè)終端設(shè)備則返回True,否則返回

Falseclose()關(guān)閉文件下面介紹使用有關(guān)方法對(duì)文件的操作。1.

寫文件1)

write()方法0

文件與數(shù)據(jù)格式化25write()方法用于將指定字符串寫入文件,其語法格式如下。write(data)其中,參數(shù)data

表示要寫入文件的數(shù)據(jù),若數(shù)據(jù)寫入成功,則write()方法會(huì)返回本次寫入文件的數(shù)據(jù)的字節(jié)數(shù)。示例代碼如程序段P10.5

所示。P10.5

write()方法寫文件string="Pythonisagreatlanguage.\nYeahits

great!!\n"withopen("test.txt","w")as

f:size=f.write(string)print(size)運(yùn)行代碼,輸出結(jié)果如下。45字符串?dāng)?shù)據(jù)被成功寫入文件,此時(shí)打開

test.txt

文件,可在文件中看到該字26符串。2)

writelines()方法writelines()方法用于將行列表寫入文件,其語法格式如下。writelines(lines)其中,參數(shù)

lines

表示要寫入文件中的數(shù)據(jù),可以是一個(gè)字符串或字符串列表。若寫入文件的數(shù)據(jù)在文件中需要換行,則應(yīng)顯示指定換行符。示例代碼如程序段P10.6

所示。P10.6

writelines()方法寫文件string="Pythonisagreatlanguage.\nYeahits

great!!\n"withopen("test.txt","w")as

f:size=f.writelines(string)print(size)0

文件與數(shù)據(jù)格式化27運(yùn)行代碼,輸出信息None,字符串被成功寫入文件。此時(shí)打開

test.txt文件,可在文件中看到寫入的字符串。2.

讀文件1)

read()方法read()方法用于從指定文件中讀取指定字節(jié)的數(shù)據(jù),其語法格式如下。read(n=-1)其中,參數(shù)n

用于設(shè)置讀取數(shù)據(jù)的字節(jié)數(shù),若未提供或設(shè)置為-1,則一次讀取并返回文件中的所有數(shù)據(jù)。以文件file.txt

為例,假設(shè)文件中的內(nèi)容如下。Pythonisagreat

language.Yeahits

great!!讀取該文件中指定長度數(shù)據(jù)的示例代碼如程序段P10.7

所示。28P10.7

read()方法讀文件withopen('file.txt',mode='r')as

f:print(f.read(2))print(f.read())運(yùn)行代碼,輸出結(jié)果如下。Pythonisagreat

language.Yeahits

great!!2)

readline()方法readline()方法用于從指定文件中讀取一行數(shù)據(jù),其語法格式如下。readline()以file.txt

文件為例,使用reading()方法讀取該文件,示例代碼如程序段0

文件與數(shù)據(jù)格式化29P10.8

所示。P10.8

readline()方法讀文件withopen('file.txt',mode='r',encoding='utf-8')asf:print(f.readline())print(f.readline())運(yùn)行代碼,輸出結(jié)果如下。Pythonisagreat

language.Yeahits

great!!3)

readlines()方法readlines()方法用于一次性讀取文件中的所有數(shù)據(jù),若讀取成功則返回一個(gè)列表,文件中的每一行對(duì)應(yīng)列表中的一個(gè)元素。readlines()方法的語法格式如下。30readlines(hint=-1)其中,參數(shù)hint

的單位為字節(jié),它用于控制要讀取的行數(shù),如果行中數(shù)據(jù)的總大小超出了hint

字節(jié),那么readlines()不會(huì)讀取更多的行。下面以file.txt

文件為例,使用

readlines()方法讀取該文件,示例代碼如程序段P10.9

所示。P10.9

readlines()方法讀取文件withopen('file.txt',mode='r',encoding='utf-8')asf:print(f.readlines())運(yùn)行代碼,輸出結(jié)果如下。['Python

is

a

great

language.\n',

'Yeah

its

great!!\n']在以上介紹的

3

個(gè)方法中,read()(參數(shù)默認(rèn)時(shí))和

readlines()方法都可一次讀取文件中的全部數(shù)據(jù),但由于計(jì)算機(jī)的內(nèi)存是有限的,當(dāng)文件較大時(shí),read()0

文件與數(shù)據(jù)格式化31和

readlines()的一次讀取可能會(huì)耗盡系統(tǒng)內(nèi)存,因此這兩種操作都不夠安全。為了保證讀取安全,通常多次調(diào)用

read()方法,每次讀取n

字節(jié)的數(shù)據(jù)。3.

文件的定位讀寫程序P10.7

使用read()方法讀取了文件file.txt,結(jié)合代碼與程序運(yùn)行結(jié)果進(jìn)行分析,可以發(fā)現(xiàn)read()方法第一次讀取了兩個(gè)字符,第二次從第三個(gè)字符“t”開始讀取了剩余字符。之所以出現(xiàn)上述情況,是因?yàn)樵谖募囊淮未蜷_與關(guān)閉之間進(jìn)行的讀寫操作是連續(xù)的,程序總是從上次讀寫的位置繼續(xù)向下進(jìn)行讀寫操作。實(shí)際上,每個(gè)文件對(duì)象都有一個(gè)稱為“文件讀寫位置”的屬性,該屬性會(huì)記錄當(dāng)前讀寫的位置。文件讀寫位置默認(rèn)為

0,即讀寫位置默認(rèn)在文件首部。Python

提供了一些獲取與修改文件讀寫位置的方法,以實(shí)現(xiàn)文件的定位讀寫,下面對(duì)這些方法進(jìn)行講解。321)

tell()方法tell()方法用于獲取文件當(dāng)前的讀寫位置。以操作文件

file.txt

為例,tell()的用法如程序段P10.10

所示。P10.10

tell()方法獲取讀寫位置withopen('file.txt')as

f:print(f.tell())print(f.read(5))print(f.tell())運(yùn)行代碼,輸出結(jié)果如下。0Pytho50

文件與數(shù)據(jù)格式化33由代碼運(yùn)行結(jié)果可知,tell()方法第一次獲取的文件讀寫位置為

0,第二次獲取的文件讀寫位置為

5。2)

seek()方法程序一般按順序讀取文件中的內(nèi)容,但并非每次讀寫都需從當(dāng)前位置開始。Python

提供了seek()方法,使用該方法可控制文件的讀寫位置,實(shí)現(xiàn)文件的隨機(jī)讀取。seek()方法的語法格式如下。seek(offset,from)其中,參數(shù)

offset

表示偏移量,即讀寫位置需要移動(dòng)的字節(jié)數(shù);from

用于指定文件的讀寫位置,該參數(shù)的取值為

0、1、2,它們代表的含義分別如下。

0:表示文件開頭。1:表示使用當(dāng)前讀寫位置。2:表示文件末尾。34seek()方法調(diào)用成功后會(huì)返回當(dāng)前讀寫位置。以操作文件file.txt

為例,seek()的用法如程序段P10.11

所示。P10.11

seek()方法讀寫文件withopen('file.txt')as

f:print(f.tell())local=

f.seek(5,0)print(local)運(yùn)行代碼,輸出結(jié)果如下。05需要注意的是,在Python

3

中,若打開的是文本文檔,那么seek()方法只允許相對(duì)于文件首部移動(dòng)文件讀寫位置;若在參數(shù)from

值為

1

2

的情況0

文件與數(shù)據(jù)格式化35下移動(dòng)文本文件的讀寫位置,程序就會(huì)產(chǎn)生錯(cuò)誤。具體示例如程序段

P10.12

所示。P10.12

seek()從當(dāng)前位置讀文本文件withopen('file.txt')as

f:f.seek(5,0)f.seek(3,1)運(yùn)行代碼,輸出結(jié)果如下。Traceback(mostrecentcall

last):File"D:/x1.py",line3,in

<module>f.seek(3,1)io.UnsupportedOperation:can'tdononzerocur-relative

seeks若要相對(duì)于當(dāng)前讀寫位置或文件末尾進(jìn)行位移操作,則需要以二進(jìn)制形式36打開文件,示例代碼如程序段P10.13

所示。P10.13

seek()讀二進(jìn)制文件withopen('file.txt','rb')as

f:f.seek(5,0)local=

f.seek(3,1)print(local)運(yùn)行代碼,輸出結(jié)果如下。8

10.2 數(shù)據(jù)格式10.2.1 數(shù)據(jù)維度數(shù)據(jù)在被計(jì)算機(jī)處理前需要進(jìn)行一定的組織,表明數(shù)據(jù)之間的基本關(guān)系和0

文件與數(shù)據(jù)格式化37邏輯,進(jìn)而形成數(shù)據(jù)的維度。維度是與事物“有聯(lián)系”的概念的數(shù)量。按照“有聯(lián)系”的概念的數(shù)量進(jìn)行劃分,事物可分為不同的維度。例如,與線有聯(lián)系的概念為長度,因此線為一維事物;與長方形面積有聯(lián)系的概念為長度和寬度,因此面積為二維事物;與長方形體積有聯(lián)系的概念為長度、寬度和高度,因此體積為三維事物。在計(jì)算機(jī)中,按照與數(shù)據(jù)“有聯(lián)系”的參數(shù)的數(shù)量進(jìn)行劃分,數(shù)據(jù)可以分為一維數(shù)據(jù)、二維數(shù)據(jù)和多維數(shù)據(jù)。1.

一維數(shù)據(jù)一維數(shù)據(jù)是具有對(duì)等關(guān)系的一組線性數(shù)據(jù),對(duì)應(yīng)數(shù)學(xué)中的集合和一維數(shù)組,在Python

語法中,一維列表、一維元組和一維集合都是一維數(shù)據(jù),可通過逗號(hào)、空格等符號(hào)分隔一維數(shù)據(jù)中的各個(gè)元素。38二維數(shù)據(jù)二維數(shù)據(jù)關(guān)聯(lián)參數(shù)的數(shù)量為

2,此數(shù)據(jù)對(duì)應(yīng)數(shù)學(xué)中的矩陣和二維數(shù)組,在Python

語法中,二維列表、二維元組等都是二維數(shù)據(jù)。表格是日常生活中比較常見的二維數(shù)據(jù)的組織形式,因此二維數(shù)據(jù)也稱為表格數(shù)據(jù)。多維數(shù)據(jù)多維數(shù)據(jù)利用鍵值對(duì)等簡單的二元關(guān)系展開數(shù)據(jù)間的復(fù)雜結(jié)構(gòu),Python

中字典類型的數(shù)據(jù)是多維數(shù)據(jù)。多維數(shù)據(jù)在網(wǎng)絡(luò)應(yīng)用中非常常見,計(jì)算機(jī)中常見的多維數(shù)據(jù)格式有HTML(hypertext

markup

language,超文本標(biāo)記語言)、XML(extensible

markup

language,可擴(kuò)展標(biāo)記語言)、JSON(JavaScriptobject

notation,JS

對(duì)象標(biāo)記)等。10.2.2 數(shù)據(jù)的存儲(chǔ)格式通常將數(shù)據(jù)存儲(chǔ)在文件中。為方便后續(xù)的讀寫操作,數(shù)據(jù)通常需要按照約0

文件與數(shù)據(jù)格式化39定的組織方式進(jìn)行存儲(chǔ)。一維數(shù)據(jù)呈線性排列,一般用特殊字符分隔,具體示例如下。使用空格分隔:成都

杭州

重慶

武漢

蘇州

西安

天津。使用逗號(hào)分隔:成都,

杭州,

重慶,

武漢,

蘇州,

西安,

天津。使用&分隔:成都&杭州&重慶&武漢&蘇州&西安&天津。在存儲(chǔ)一維數(shù)據(jù)時(shí),可使用不同的特殊字符分隔數(shù)據(jù)元素,但需要注意以下幾點(diǎn)。同一文件或同組文件一般使用同一分隔符分隔。分隔數(shù)據(jù)的分隔符不應(yīng)出現(xiàn)在數(shù)據(jù)中。分隔符為英文半角符號(hào),一般不使用中文符號(hào)作為分隔符。二維數(shù)據(jù)可視為一維數(shù)據(jù)的集合,當(dāng)二維數(shù)據(jù)只有一個(gè)元素時(shí),這個(gè)二維數(shù)據(jù)就是一維數(shù)據(jù)。國際上通用的一維數(shù)據(jù)和二維數(shù)據(jù)存儲(chǔ)格式為CSV(comma-separated

value,逗號(hào)分隔值)。CSV

文件以純文本形式存儲(chǔ)表40格數(shù)據(jù),文件的每一行對(duì)應(yīng)表格中的一條數(shù)據(jù)記錄,每條記錄由一個(gè)或多個(gè)字段組成,字段之間使用逗號(hào)(英文半角)分隔。由于字段之間可能使用除逗號(hào)外的其他分隔符,因此CSV

也稱為字符分隔值。計(jì)算機(jī)采用CSV

格式存儲(chǔ)的數(shù)據(jù)其文件后綴一般為.csv,此種文件在

Windows

平臺(tái)中可通過辦公軟件Excle

或記事本打開。三維數(shù)據(jù)是二維數(shù)據(jù)的集合,四維數(shù)據(jù)是三維數(shù)據(jù)的集合,如果按照這種層層嵌套的方式組織數(shù)據(jù),那么多維數(shù)據(jù)的表示會(huì)非常復(fù)雜。為了直觀地表示多維數(shù)據(jù),也為了方便組織和操作多維數(shù)據(jù),三維及以上的多維數(shù)據(jù)統(tǒng)一采用鍵值對(duì)的形式進(jìn)行格式化。網(wǎng)絡(luò)平臺(tái)上傳遞的數(shù)據(jù)大多是多維數(shù)據(jù),網(wǎng)絡(luò)中常見的多維數(shù)據(jù)格式

JSON是一種輕量級(jí)的數(shù)據(jù)交換形式,本質(zhì)上是一種被格式化的字符串,既易于人們閱讀和編寫,也易于機(jī)器解析和生成。JSON

語法是JavaScript

語法的子集,JavaScript

語言中的一切都是對(duì)象,因此,JSON

也以對(duì)象的形式表示數(shù)據(jù)。0

文件與數(shù)據(jù)格式化41JSON

格式的數(shù)據(jù)遵循以下語法規(guī)則。數(shù)據(jù)存儲(chǔ)在鍵值對(duì)(key:

value)中,如"姓名":

"張華"。數(shù)據(jù)的字段由逗號(hào)分隔,如"姓名":

"張華","語文":

"116"。一個(gè)花括號(hào)保存一個(gè)JSON

對(duì)象,如{"姓名":

"張華","語文":

"116"}。一個(gè)方括號(hào)保存一個(gè)數(shù)組,如[{"姓名":

"張華",

"語文":

"116"}]。除JSON

外,網(wǎng)絡(luò)平臺(tái)也會(huì)使用

XML、HTML

等格式組織多維數(shù)據(jù),XML和HTML

格式通過標(biāo)簽組織數(shù)據(jù)。與

XML、HTML

格式相比,JSON

格式組織的多維數(shù)據(jù)更直觀,且數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論