《Python程序設(shè)計基礎(chǔ)》課件-第7章文件及數(shù)據(jù)格式化_第1頁
《Python程序設(shè)計基礎(chǔ)》課件-第7章文件及數(shù)據(jù)格式化_第2頁
《Python程序設(shè)計基礎(chǔ)》課件-第7章文件及數(shù)據(jù)格式化_第3頁
《Python程序設(shè)計基礎(chǔ)》課件-第7章文件及數(shù)據(jù)格式化_第4頁
《Python程序設(shè)計基礎(chǔ)》課件-第7章文件及數(shù)據(jù)格式化_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄CONTENT010203文件的使用數(shù)據(jù)組織及處理學(xué)生成績處理實例01文件的使用

MORETHENTEMPLATE文件概念文件是長期存儲在輔助存儲設(shè)備上的一段數(shù)據(jù)流,可以反復(fù)使用及修改。例如文本文件、日志文件、數(shù)據(jù)庫文件、圖像文件、聲音文件、視頻文件、可執(zhí)行文件等等,這些文件都以不同的文件形式存儲在各種計算機的存儲設(shè)備中。浙江財經(jīng)大學(xué)東方學(xué)院信息分院37.1.1文件概述

MORETHENTEMPLATE文件類型文件可以分為文本文件和二進制文件兩種。文本文件一般是由具有統(tǒng)一字符編碼的字符組成,能用文本處理程序如記事本打開。二進制文件一般沒有統(tǒng)一的字符編碼,直接由比特0和1組成,無法用記事本或其它字處理軟件正常打開,因此也無法直接閱讀和理解,需要正確的軟件才能正常打開閱讀。如可執(zhí)行文件calc.exe,可以用HexEditor等十六進制編輯器打開查看和修改,但需要我們對這種類型的文件結(jié)構(gòu)有深入的了解。浙江財經(jīng)大學(xué)東方學(xué)院信息分院47.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較(1)首先,利用記事本程序生成一個文本文件7.1.txt,內(nèi)容為“長風(fēng)破浪會有時,直掛云帆濟滄海?!保謩e用文本文件方式和二進制文件方式打開該文件,觀察結(jié)果。代碼如下:fo=open("7.1.txt","rt")#“rt”表示以文本只讀方式打開print(fo.read())fo.close()輸出結(jié)果如下:長風(fēng)破浪會有時,直掛云帆濟滄海。浙江財經(jīng)大學(xué)東方學(xué)院信息分院57.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較fo=open("7.1.txt","rb")#“rb”表示以二進制只讀方式打開print(fo.read())fo.close()輸出結(jié)果如下:b'\xb3\xa4\xb7\xe7\xc6\xc6\xc0\xcb\xbb\xe1\xd3\xd0\xca\xb1\xa3\xac\xd6\xb1\xb9\xd2\xd4\xc6\xb7\xab\xbc\xc3\xb2\xd7\xba\xa3\xa1\xa3'可以看到,文本文件以文本方式打開時,結(jié)果仍舊是可以直觀閱讀的文本,而文本文件以二進制方式打開時,顯示的是文本文件中每個漢字的字符編碼,這里是GBK的編碼,如“長”這個漢字的GBK編碼為b3a4,“風(fēng)”的GBK編碼為b7e7,一個漢字為2個字節(jié)。實際上,文本文件保存時是以字符編碼形式保持的,在文本文件打開方式打開時,文件會進行解碼還原漢字并顯示,而以二進制方式打開時,直接顯示漢字的字符編碼。浙江財經(jīng)大學(xué)東方學(xué)院信息分院67.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較(2)分別用文本文件方式和二進制文件方式打開windows附件下的計算器可執(zhí)行文件calc.exe文件。代碼如下:fo=open("calc.exe","rt")#以文本方式打開print(fo.read())fo.close()輸出結(jié)果如下:UnicodeDecodeError:'gbk'codeccan'tdecodebyte0x90inposition2:illegalmultibytesequence可以看到,當(dāng)代碼用文本文件打開calc.exe文件時,會出現(xiàn)上面的出錯信息,主要是由于calc.exe是二進制文件,不能用BGK進行解碼,因此出錯。浙江財經(jīng)大學(xué)東方學(xué)院信息分院77.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較如果calc.exe用記事本程序打開,結(jié)果見圖7-1,可以看到結(jié)果是亂碼,因為無法正確解讀二進制文件。

圖7-1記事本打開的亂碼文件浙江財經(jīng)大學(xué)東方學(xué)院信息分院87.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較fo=open("calc.exe","rb")#以二進制方式打開print(fo.read())fo.close()部分輸出結(jié)果如下:b'MZ\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\x00\x00浙江財經(jīng)大學(xué)東方學(xué)院信息分院97.1.1文件概述

MORETHENTEMPLATE例7-1文本文件和二進制文件比較也可以用HexEditor打開時,可以看到二進制數(shù)據(jù)流,見圖7-2。圖7-2HexEditor打開的二進制數(shù)據(jù)流可以看到,二進制文件以二進制文件方式打開,可以正確解讀,顯示的是字節(jié)流,但不能以文本方式打開,打開時會出錯,顯示亂碼。浙江財經(jīng)大學(xué)東方學(xué)院信息分院107.1.1文件概述

MORETHENTEMPLATE1、

文件的打開文件在讀寫之前,需要先打開文件并創(chuàng)建文件對象,利用該文件對象對文件內(nèi)容進行讀寫操作。讀寫操作完畢,需要對文件進行關(guān)閉,保存文件內(nèi)容。Python通過內(nèi)置的open()函數(shù)打開一個文件,并創(chuàng)建文件對象。open()函數(shù)的完整使用方法如下,其中很多參數(shù)都有默認(rèn)參數(shù),在調(diào)用時無需特別傳遞參數(shù)。<變量名>=open(file,mode="r",buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)其中,<變量名>用來保存open()函數(shù)所創(chuàng)建的文件對象。浙江財經(jīng)大學(xué)東方學(xué)院信息分院117.1.2文件的打開和關(guān)閉

MORETHENTEMPLATE下面介紹主要的參數(shù),含義如下。(1)file參數(shù)指定需要打開的文件名及其文件路徑。文件路徑可以是相對路徑或者絕對路徑。文件名需要指定擴展名,不指定擴展名,會拋出異常FileNotFoundError。相對路徑不是完整的路徑,而是指相對于當(dāng)前文件夾的路徑。絕對路徑是完整的路徑,是從硬盤的根目錄(盤符)開始的路徑。當(dāng)前文件夾可以用如下代碼獲取。importosprint(os.getcwd())例如,若用上述代碼獲得當(dāng)前路徑為“E:\python教材編寫\第7章案例”,則下面兩條語句打開的是同一個文件。fo=open("7.1.txt","r")#相對路徑fo=open("e:\\python教材編寫\\第7章案例\\7.1.txt","r")#絕對路徑表示都是從當(dāng)前路徑下打開7.1.txt文件。浙江財經(jīng)大學(xué)東方學(xué)院信息分院127.1.2文件的打開和關(guān)閉

MORETHENTEMPLATE(2)mode參數(shù)指定文件的打開模式,例如,有“只讀”、“只寫”、“讀寫”等打開模式,默認(rèn)打開模式為“文本只讀”模式打開。浙江財經(jīng)大學(xué)東方學(xué)院信息分院137.1.2文件的打開和關(guān)閉模式說明r只讀模式(默認(rèn)值,可以省略),如果文件不存在,則返回異常。w覆蓋寫模式,如果文件存在,則清空原來內(nèi)容,不存在,則創(chuàng)建文件x創(chuàng)建寫模式,如果文件存在,則拋出異常,不存在,則創(chuàng)建文件a追加寫模式,如果文件存在,則在最后追加內(nèi)容,不存在,則創(chuàng)建文件b二進制模式,但使用二進制模式打開時,不能指定encoding參數(shù)t文本模式+不單獨使用,與“r”、“w”“x”“a”一起使用,表示增加讀或者寫功能

MORETHENTEMPLATE打開模式如果是只讀,就不能寫文件。打開模式是寫模式(覆蓋寫、創(chuàng)建寫和追加寫),就不能讀文件。如果既要讀文件又要寫文件,則可以采用“r+”,“w+”,“x+”,“a+”的組合模式,不能采用“rw”,“rx”“ra”組合模式,會拋出異常ValueError。用“w+”模式打開文件,此時會將文件指針移到文件頭,文件原有的內(nèi)容會被清空,原有的內(nèi)容無法讀出。用“a+”模式打開文件,此時會將文件指針移到文件尾,如果要讀取文件原有的內(nèi)容,則需要移動文件指針到文件頭位置,然后讀取文件內(nèi)容。打開模式中可以單獨使用“r”,“w”,“x”,“a”,而“b”,“t”,”+”不能單獨使用,需要和“r”,“w”,“x”,“a”組合使用。浙江財經(jīng)大學(xué)東方學(xué)院信息分院147.1.2文件的打開和關(guān)閉

MORETHENTEMPLATE(3)encoding參數(shù)表示采用何種編碼方式打開文件,一般采用utf-8或者gbk編碼方式。對于中文,由于編碼方式不同,存在gbk編碼及unicode編碼等多種編碼方式,在打開中文時,需要指定文件的編碼方式。例如,文本文件在保存時用utf-8編碼的,則打開文件時需要指定文件的編碼方式為utf-8,如果源文件采用unicode編碼的,則打開文件時指定文件的編碼方式為utf-16,如果不指定編碼方式,默認(rèn)解碼的方式為gbk編碼。例如result.txt文件的編碼方式為unicode編碼,則打開文件代碼如下:fo=open("result.txt",encoding="utf-16")如果不指定encoding參數(shù)為utf-16,則默認(rèn)用gbk解碼打開,此時會報錯。浙江財經(jīng)大學(xué)東方學(xué)院信息分院157.1.2文件的打開和關(guān)閉

MORETHENTEMPLATE2、

文件的關(guān)閉文件使用完畢之后,需要用close()函數(shù)將文件關(guān)閉,這樣才能保證所作的修改能保存到文件中。該函數(shù)的使用方法如下:<變量名>.close()這里的變量名是指前面open()函數(shù)所創(chuàng)建的文件對象。例如關(guān)閉前面打開的result.txt文件,代碼如下:fo.close()浙江財經(jīng)大學(xué)東方學(xué)院信息分院167.1.2文件的打開和關(guān)閉

MORETHENTEMPLATE利用open()函數(shù)打開文件后會創(chuàng)建一個文件對象,通過該文件對象可以對文件進行讀寫操作及文件指針的移動操作。1文件讀取方法浙江財經(jīng)大學(xué)東方學(xué)院信息分院177.1.3文件的讀寫表7-2文件讀取方法方法功能說明read(size=-1)默認(rèn)讀出文件所有內(nèi)容,類型為字符串。如果給出參數(shù)size,則從文本文件中讀取size個字符,或者從二進制文件中讀取size個字節(jié)readline(size=-1)默認(rèn)讀出一行,類型為字符串。如果給出參數(shù),則讀取該行前size個字符或者字節(jié)readlines(hint=-1)默認(rèn)讀出所有行,結(jié)果為列表,列表元素為文件中的每一行。如果給出參數(shù),則讀取hint行

MORETHENTEMPLATE【例7-2】分別用三種讀取方法讀取文件并輸出。首先,建立一個文本文件7.2.txt,文件中輸入《論語》學(xué)而篇第一篇。(1)用read()方法讀出并顯示,代碼如下:fo=open("7.2.txt","r")print(fo.read())結(jié)果顯示如下:read()方法將文本文件中的所有文字讀出,結(jié)果為字符串類型數(shù)據(jù)。print()函數(shù)再將該字符串輸出顯示。浙江財經(jīng)大學(xué)東方學(xué)院信息分院187.1.3文件的讀寫

MORETHENTEMPLATE(2)用readline()方法讀出并顯示fo=open("7.2.txt","r")line=fo.readline()whileline:print(line)line=fo.readline()fo.close()結(jié)果顯示如右圖所示:思路是:讀出一行,輸出一行,循環(huán)的條件是讀出的行不為空,如果為空,則說明讀完,停止循環(huán)??梢钥吹剑信c行之間會空一行。這是為什么呢?這是因為print()函數(shù)默認(rèn)換行輸出,若不要空一行,可以將上面的print(line)改為如下代碼:print(line,end="")浙江財經(jīng)大學(xué)東方學(xué)院信息分院197.1.3文件的讀寫

MORETHENTEMPLATE(3)用readlines()方法讀出并顯示fo=open("7.2.txt","r")forlineinfo.readlines(): print(line)fo.close()結(jié)果與用readline()方法讀出的結(jié)果一樣。要注意,這里fo.readlines()方法返回的是每一行作為元素構(gòu)成的列表,用print()輸出如下:['學(xué)而時習(xí)之,不亦說乎?\n','有朋自遠(yuǎn)方來,不亦樂乎?\n','人不知而不慍,不亦君子乎?']代碼中的line是列表里的每一個元素,即每一行。列表中的“\n”表示換行符,正因為有換行符,文本文件中才能分行顯示。浙江財經(jīng)大學(xué)東方學(xué)院信息分院207.1.3文件的讀寫

MORETHENTEMPLATE上面的readlines()一次性將所有的行讀出并存放到列表,對于大文件,一次性讀出會占用大量內(nèi)存,因此,可以通過直接訪問文件對象來替代,代碼如下:fo=open("7.2.txt","r")forlineinfo:print(line)fo.close()這里將fo.readlines()改為fo。文件對象fo可直接迭代,可用for循環(huán)遍歷文件對象變量輸出每一行。浙江財經(jīng)大學(xué)東方學(xué)院信息分院217.1.3文件的讀寫2文件寫入方法浙江財經(jīng)大學(xué)東方學(xué)院信息分院227.1.3文件的讀寫

除了文件的讀取方法,Python還提供了兩種文件寫入的方法,見表7-3。方法功能說明write(text)寫字符串或字節(jié)流text到文件中。writelines(lines)寫列表lines到文件中,lines列表中的元素為字符串表7-3文件寫入方法

MORETHENTEMPLATE【例7-3】用兩種寫入方法將《論語》學(xué)而篇第一篇寫入7.3.txt文件中。(1)用write(text)方法寫入文件首先以只寫模式打開文件。由于write(text)方法是寫入字符串,因此,這里先將學(xué)而篇第一篇保存到txt變量中,然后再用write()方法寫入文件。保存的時候注意每一行的后面要補上換行符,當(dāng)寫入文件后,txt文件中才會換行保存。txt='''學(xué)而時習(xí)之,不亦說乎?\n有朋自遠(yuǎn)方來,不亦樂乎?\n人不知而不慍,不亦君子乎?'''fo=open("7.3.txt","w")fo.write(txt)fo.close()運行后打開7.3.txt文件,結(jié)果見圖7-3。浙江財經(jīng)大學(xué)東方學(xué)院信息分院237.1.3文件的讀寫圖7-3運行結(jié)果

MORETHENTEMPLATE【例7-3】用兩種寫入方法將《論語》學(xué)而篇第一篇寫入7.3.txt文件中。(2)用writelines(lines)寫入文件首先以只寫模式打開文件。由于writelines(lines)方法是寫入列表,因此,我們首先用列表ls保存唐詩的每一行,每一行是一個字符串,末尾加上換行符,然后將列表寫入文件即可。txt='''學(xué)而時習(xí)之,不亦說乎?\n有朋自遠(yuǎn)方來,不亦樂乎?\n人不知而不慍,不亦君子乎?'''fo=open("7.3.txt","w")fo.writelines(ls)fo.close()運行后結(jié)果與write方法寫入文件相同。浙江財經(jīng)大學(xué)東方學(xué)院信息分院247.1.3文件的讀寫

MORETHENTEMPLATE“學(xué)而時習(xí)之,不亦樂乎?”是《論語》開篇之作-學(xué)而篇的第一句。這句話指出,人要不斷學(xué)習(xí),甚至終身學(xué)習(xí)。終身學(xué)習(xí)是社會每個成員為適應(yīng)社會發(fā)展和實現(xiàn)個體發(fā)展的需要,貫穿于人的一生的、持續(xù)的學(xué)習(xí)過程。國家21世紀(jì)教育委員會向聯(lián)合國教科文組織提交的報告中指出:“終身學(xué)習(xí)是21世紀(jì)人的通行證”。比爾.蓋茨曾經(jīng)說過:“21世紀(jì),人們比的不是學(xué)習(xí),而是學(xué)習(xí)的速度?!痹诂F(xiàn)在的企業(yè)環(huán)境,沒有打不破的鐵飯碗。就如近年來飛速發(fā)展的教育培訓(xùn)行業(yè),在這個炎熱的六月,不啻于遭遇了一場暴風(fēng)雪。有關(guān)部門的一連串工作,就像一套組合拳,打的培訓(xùn)機構(gòu)暈頭轉(zhuǎn)向,教育培訓(xùn)機構(gòu)大量裁員,一大批的教育培訓(xùn)人員失業(yè),甚至有剛?cè)肼毜拇髮W(xué)生,馬上就遭到辭退。今天你的工作可能不可或缺,并不意味著明天你的職位還存在。所以,我們必須不斷學(xué)習(xí),防患于未然。浙江財經(jīng)大學(xué)東方學(xué)院信息分院257.1.3文件的讀寫

MORETHENTEMPLATE終身學(xué)習(xí)方面,有許多這方面的榜樣。著名的物理學(xué)家愛因斯坦,就是終身學(xué)習(xí)的踐行者。有人問愛因斯坦:“您可謂物理學(xué)界空前絕后的人了,何必還孜孜不倦地學(xué)習(xí)?何不舒舒服服地休息呢?”愛因斯坦找來一支筆、一張畫,畫了一個大圓和一個小圓,說:“目前,在物理學(xué)這個領(lǐng)域,可能是我比你懂得略多一些,正如你所知的是這個小圓,我所知的是這個大圓,然而,整個物理學(xué)是無邊無際的,小圓的周長小,即與未知領(lǐng)域的接觸面小,所以感受到自己未知的東西少;而大圓與外界接觸的這一周長,所以感到自己未知的東西多,會更加努力去探索?!薄帮埧梢砸蝗詹怀?,覺可以一日不睡,書不可以一日不讀;讀書治學(xué),一是要珍惜時間,二是要勤奮刻苦,除此以外,沒有什么竅門和捷徑?!边@是毛澤東常說的一句話。我們每個人要樹立終身學(xué)習(xí)的觀念,做到在學(xué)習(xí)中工作,在工作中學(xué)習(xí),真正做到“活到老,學(xué)到老?!闭憬斀?jīng)大學(xué)東方學(xué)院信息分院267.1.3文件的讀寫

MORETHENTEMPLATE3文件的指針及移動操作

在文件的讀寫過程中,文件指針起著很重要的作用。文件的讀寫,都是從文件指針的位置開始讀寫的。這就是為什么有時候看起來應(yīng)該打印輸出內(nèi)容,而實際上沒有輸出內(nèi)容的原因。以“r”或者“r+”模式打開文件時,文件指針指向文件頭。以“w”或者“w+”模式打開文件時,文件指針指向文件頭,并清空文件內(nèi)容。以“a”或者“a+”模式打開文件時,文件指針指向文件尾。Python關(guān)于文件指針的相關(guān)操作方法見表7-4。浙江財經(jīng)大學(xué)東方學(xué)院信息分院277.1.3文件的讀寫表7-4文件指針相關(guān)操作方法功能說明tell()返回文件指針的當(dāng)前位置seek(offset[,whence])把文件指針移動到新的位置。offset為相對于whence的位置。whence為0,表示文件頭,whence為1,表示當(dāng)前位置,whence為2,表示文件尾。默認(rèn)為0

MORETHENTEMPLATE

例如,在result.txt文件中輸入“孤帆遠(yuǎn)影碧空盡,唯見長江天際流。”,并輸入回車換行符。“,”和“?!倍际侵形臓顟B(tài)下輸入的。此時idle中輸入以下代碼:>>>os.chdir("e:\\python教材編寫\\第7章案例")>>>fo=open("result.txt","r")>>>fo.tell()0>>>fo.readline()'孤帆遠(yuǎn)影碧空盡,唯見長江天際流。\n'>>>fo.tell()34>>>fo.seek(0,0)#文件指針移到文件頭0浙江財經(jīng)大學(xué)東方學(xué)院信息分院287.1.3文件的讀寫

MORETHENTEMPLATE>>>fo.tell()#顯示當(dāng)前文件指針位置為00可以看到以只讀模式打開文件時,fo.tell()輸出的文件指針位置為0,即在文件頭開始位置。當(dāng)用readline()讀出當(dāng)前行后,此時再次用fo.tell()輸出,則文件指針位置為34。這是因為一個漢字為兩個字節(jié),包括標(biāo)點符號都是中文輸入的,因此這句詩的字節(jié)一共是32個字節(jié),再加上行尾的回車換行符,加起來一共是34個字節(jié)。這里的result.txt的編碼方式采用ANSI編碼方式,如果是其他的編碼方式,字節(jié)數(shù)大于34個字節(jié),因為還有BOM標(biāo)簽。浙江財經(jīng)大學(xué)東方學(xué)院信息分院297.1.3文件的讀寫擴展:記事本程序保存文件時的編碼方式有4種:ANSI,Unicode,Unicodebigendian,UTF-8這四種。為了在打開文件時能夠識別文件內(nèi)容是哪種編碼方式,在文件的開頭會加上一個標(biāo)簽,叫BOM標(biāo)簽。標(biāo)簽如果是0xFF0XFE,則為unicode編碼,如果是0xFE0xFF,則為unicodebigendian編碼,如果是0xEF0xBB0xBF,則是UTF-8編碼。如果沒有這些標(biāo)簽,那么就是ANSI編碼,使用操作系統(tǒng)的默認(rèn)語言編碼來解釋。

MORETHENTEMPLATE【例7-4】有一個英文文本文件,編寫程序讀取其內(nèi)容,并將文件里面的大寫字母變成小寫字母,小寫字母變成大寫字母。首先,用記事本創(chuàng)建一個文本文件english.txt,輸入“Ilovemycountry-China!”。由于文件需要讀取,又要寫入,因此選用“r+”模式。編寫程序代碼如下:fo=open("english.txt","r+")result=""#保存大小寫轉(zhuǎn)換后的英文字符串forsinfo.read():ifs.islower():#如果是小寫字母,則轉(zhuǎn)換為大寫result+=s.upper()elifs.isupper():#如果是大寫字母,則轉(zhuǎn)換為小寫result+=s.lower()else:#如果是其他字符,則無需轉(zhuǎn)換result+=s浙江財經(jīng)大學(xué)東方學(xué)院信息分院307.1.3文件的讀寫fo.write(result)fo.close()

MORETHENTEMPLATE運行結(jié)果如下:結(jié)果不是將原來的文件內(nèi)容改變了,而是在原來文件的末尾處增加了一段大小寫轉(zhuǎn)換后的英文,這是為什么呢?這主要是由于在執(zhí)行代碼fo.read()時,文件指針的位置發(fā)生變化了,文件指針的位置移到了文件尾的位置,我們可以在fo.write(result)這句代碼之前加入fo.tell()來觀察文件指針的位置,此時輸出24,也就是在文件尾的位置。然后當(dāng)執(zhí)行fo.write(result)代碼時,將從當(dāng)前位置即文件尾的位置開始寫入,從而在文件尾增加了一行。如何能實現(xiàn)題目的要求呢?可以在fo.write(result)語句之前加入fo.seek(0,0),將文件指針位置移到文件頭,再寫入文件,則可以實現(xiàn)題目要求。浙江財經(jīng)大學(xué)東方學(xué)院信息分院317.1.3文件的讀寫02數(shù)據(jù)組織及處理1,35926778%除了單一的數(shù)據(jù),更多的數(shù)據(jù)需要按照一定的方式組織起來,便于程序中顯示及存儲器中存儲。按照數(shù)據(jù)的組織方式劃分,數(shù)據(jù)可以劃分為一維數(shù)據(jù)、二維數(shù)據(jù)和高維數(shù)據(jù)。本書主要介紹一維數(shù)據(jù)和二維數(shù)據(jù)。一維數(shù)據(jù)由對等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成,采用線性組織方式。二維數(shù)據(jù)是由多個一維數(shù)據(jù)構(gòu)成,是一維數(shù)據(jù)的組合形式。浙江財經(jīng)大學(xué)東方學(xué)院信息分院337.2.1數(shù)據(jù)的組織1,35926778%一維數(shù)據(jù)對應(yīng)數(shù)組和集合概念,在Python中可以由列表,元組或者集合表示。如果數(shù)據(jù)是有序的數(shù)據(jù),則用列表和元組表示。如果是無序的數(shù)據(jù),則用集合表示。例如:列表ls1=["李白","杜甫","白居易"],集合s={"李白","杜甫","白居易"},元組tp=("李白","杜甫","白居易")。二維數(shù)據(jù)對應(yīng)表的概念。在Python中可以用二維列表表示。例如:ls2=[["陶淵明","孟浩然","王維"],["高適","岑參","王之渙"],["杜甫","辛棄疾","陸游"]]。ls2列表中的每一個元素又是一個列表。二維列表是由多個一維列表組成的。浙江財經(jīng)大學(xué)東方學(xué)院信息分院347.2.2一二維數(shù)據(jù)的表示1,35926778%一維數(shù)據(jù)對應(yīng)數(shù)組和集合概念,在Python中可以由列表,元組或者集合表示。如果數(shù)據(jù)是有序的數(shù)據(jù),則用列表和元組表示。如果是無序的數(shù)據(jù),則用集合表示。例如:列表ls1=["李白","杜甫","白居易"],集合s={"李白","杜甫","白居易"},元組tp=("李白","杜甫","白居易")。二維數(shù)據(jù)對應(yīng)表的概念。在Python中可以用二維列表表示。例如:ls2=[["陶淵明","孟浩然","王維"],["高適","岑參","王之渙"],["杜甫","辛棄疾","陸游"]]。ls2列表中的每一個元素又是一個列表。二維列表是由多個一維列表組成的。浙江財經(jīng)大學(xué)東方學(xué)院信息分院357.2.3一二維數(shù)據(jù)的存儲1一維數(shù)據(jù)的存儲一維數(shù)據(jù)有多種存儲方式,通常采用特殊分隔符進行分隔存儲。(1)由空格分隔,例如:李白杜甫白居易(2)由逗號分隔李白,杜甫,白居易(3)由特殊符號分隔李白#杜甫#白居易浙江財經(jīng)大學(xué)東方學(xué)院信息分院367.2.3一二維數(shù)據(jù)的存儲2二維數(shù)據(jù)的存儲二維數(shù)據(jù)由多個一維數(shù)據(jù)組成。這里介紹csv格式文件,可用于存儲一、二維數(shù)據(jù)。這是一種通用的文件存儲格式,被商業(yè)和科學(xué)廣泛應(yīng)用。CSV格式是一種逗號分隔值(Comma-SeparatedValues,CSV)的文件存儲方式,其文件以純文本形式存儲數(shù)據(jù)。CSV文件是指具有以下特征的文件:(1)純文本格式,文件存儲的是字符序列。(2)開頭不留空行,以行為單位(3)可包含或者不含列名,包含列名時則放在文件的第一行(4)文件由記錄組成,每一行是一條記錄。(5)每行記錄的數(shù)據(jù)之間用半角逗號作分隔符,列為空也要保留逗號例如,前面的二維列表在文件中可作如下形式保存。陶淵明,孟浩然,王維高適,岑參,王之渙杜甫,陸游,辛棄疾浙江財經(jīng)大學(xué)東方學(xué)院信息分院377.2.3一二維數(shù)據(jù)的存儲下面以csv格式文件為例,介紹一二維數(shù)據(jù)的處理。1一維數(shù)據(jù)的處理從csv文件讀入一維數(shù)據(jù)后,可以用split()函數(shù)分隔存放到列表。如果要寫入一維列表數(shù)據(jù)到csv文件中,可以用join()函數(shù)將一維列表的各個元素用逗號連接起來寫入文件即可。【例7-5】一維數(shù)據(jù)的讀入首先,利用Excel建立7.5.csv文件,輸入“李白,杜甫,白居易”,見圖7-4。

圖7-47.5csv文件內(nèi)容浙江財經(jīng)大學(xué)東方學(xué)院信息分院387.2.4一二維數(shù)據(jù)的處理下面以csv格式文件為例,介紹一二維數(shù)據(jù)的處理。接下來將7.5.csv文件的內(nèi)容讀出到列表ls中,代碼如下:fo=open("7.5.csv","r")str=fo.read()#讀出文件所有內(nèi)容,結(jié)果為字符串str=str.replace("\n","")#去掉末尾換行符ls=str.split(",")#以空格分隔str字符串,并將元素存入列表lsprint(ls)fo.close()輸出為一個一維列表,運行結(jié)果如下:['李白','杜甫','白居易']浙江財經(jīng)大學(xué)東方學(xué)院信息分院397.2.4一二維數(shù)據(jù)的處理【例7-6】一維數(shù)據(jù)的寫入fo=open("7.6.csv","w")ls=["李白","杜甫","白居易"]str=",".join(ls)#將列表內(nèi)的元素用逗號連接起來保存到str字符串fo.write(str)#將str字符串寫入文件fo.close()運行后打開7.6.csv,結(jié)果與圖7-4相同。浙江財經(jīng)大學(xué)東方學(xué)院信息分院407.2.4一二維數(shù)據(jù)的處理2二維數(shù)據(jù)的處理二維數(shù)據(jù)的處理,包括二維數(shù)據(jù)從csv格式文件讀入到二維列表、二維列表元素的處理以及二維列表寫入到csv格式文件中。【例7-7】從csv格式文件讀入到二維列表中首先,利用Excel輸入以下內(nèi)容,另存為7.7.csv格式文件,見圖7-5。

圖7-57.7csv文件內(nèi)容浙江財經(jīng)大學(xué)東方學(xué)院信息分院417.2.4一二維數(shù)據(jù)的處理接下來從7.7.csv文件中讀入內(nèi)容并保存到二維列表中l(wèi)s中,代碼如下:fo=open("7.7.csv","r")ls=[]forlineinfo:#line表示文件中的每一行,行尾有換行符line=line.replace("\n","")#將換行符替換為空字符串ls.append(line.split(","))#將行字符串分隔為一維列表并追加print(ls)fo.close()案例中,用for循環(huán)遍歷每一行,然后對每行處理為一維列表并追加到二維列表中。運行后列表ls內(nèi)容如下,是一個二維列表。[['陶淵明','孟浩然','王維'],['高適','岑參','王之渙'],['杜甫','辛棄疾','陸游']]浙江財經(jīng)大學(xué)東方學(xué)院信息分院427.2.4一二維數(shù)據(jù)的處理【例7-8】二維數(shù)據(jù)的寫入fo=open("7.8.csv","w")ls=[["陶淵明","孟浩然","王維"],["高適","岑參","王之渙"],["杜甫","辛棄疾","陸游"]]forlineinls:#line為ls中的每一個一維列表str=",".join(line)#將一維列表元素之間用逗號連接為字符串str+="\n"#字符串末尾加上換行符,以便寫入文本時換行fo.write(str)#寫入字符串fo.close()案例中,用for循環(huán)遍歷每個一維列表,將每一個一維列表處理成一個元素之間逗號相連接,尾部帶有換行符的一個字符串,然后寫入文件。運行后打開7.8.csv文件,內(nèi)容見圖7-6。浙江財經(jīng)大學(xué)東方學(xué)院信息分院437.2.4一二維數(shù)據(jù)的處理【例7-9】二維列表元素的遍歷輸出。二維數(shù)據(jù)元素的訪問,類似于矩陣元素的訪問,可以用行號和列號訪問。例如,前面的二維列表ls2中,"陶淵明"在第0行第0列中,可以用print(ls[0][0])輸出,"王之渙"在第1行第2列,可以用print(ls[1][2])輸出,也就是用行號和列號定位某個元素。如果要輸出第0行,可以用print(ls[0])輸出,要輸出第2行,可以用print(ls[2])輸出。二維列表元素的遍歷,可以用雙層for循環(huán)遍歷輸出。循環(huán)遍歷時,可以用兩個變量分別表示行號和列號,定位每個元素并輸出;也可以外循環(huán)遍歷二維列表中的每一個一維列表,再內(nèi)循環(huán)遍歷每一個一維列表并輸出元素。浙江財經(jīng)大學(xué)東方學(xué)院信息分院447.2.4一二維數(shù)據(jù)的處理【例7-9】二維列表元素的遍歷輸出。(1)第一種方法ls=[["陶淵明","孟浩然","王維"],["高適","岑參","王之渙"],["杜甫","辛棄疾","陸游"]]forrowinrange(len(ls)):#row為行號forcolinrange(len(ls[row])):#col為列號element=ls[row][col]#通過行號和列號訪問print(element,end="")print("\n")#一行輸出后換行浙江財經(jīng)大學(xué)東方學(xué)院信息分院457.2.4一二維數(shù)據(jù)的處理【例7-9】二維列表元素的遍歷輸出。(2)第二種方法ls=[["陶淵明","孟浩然","王維"],["高適","岑參","王之渙"],["杜甫","辛棄疾","陸游"]]forlineinls:#外循環(huán)遍歷每一個一維列表forelementinline:#內(nèi)循環(huán)遍歷每一個一維列表中的元素print(element,end="")print("\n")#一行輸出后換行浙江財經(jīng)大學(xué)東方學(xué)院信息分院467.2.4一二維數(shù)據(jù)的處理03學(xué)生成績處理實例有某班級學(xué)生三門課程的學(xué)生成績,用文本文件保存,內(nèi)容見圖7-7,現(xiàn)要求輸出該班級所有學(xué)生的總分,并對總分進行排名,同時輸出每門課程的最高分,最低分以及平均分。

圖7-7學(xué)生成績表浙江財經(jīng)大學(xué)東方學(xué)院信息分院487.3學(xué)生成績處理實例代碼如下所示:defcalcScore(xs,kc):#輸入學(xué)生列表,課程名稱,返回課程的最高分,最低分,平均分col=xs[0].index(kc)headLine=xs[0]#headline為標(biāo)題行xs.pop(0)kcScore=[]forlsinxs:kcScore.append(ls[col])maxScore=max(kcScore)##找出最高分minScore=min(kcScore)##找出最低分aveScore=sum(kcScore)/len(kcScore)##找出平均值xs.insert(0,headLine)returnmaxScore,minScore,aveScore浙江財經(jīng)大學(xué)東方學(xué)院信息分院497.3學(xué)生成績處理實例#計算總分并根據(jù)總分降序排序,給出排名并輸出顯示defRank(xs):headLine=xs[0]headLine.append("總分")headLine.append("排名")xs.pop(0)#計算總分forlineinxs:score=line[2]+line[3]+line[4]line.append(score)col=headLine.index("總分")xs.sort(key=lambdax:x[col],reverse=True)浙江財經(jīng)大學(xué)東方學(xué)院信息分院507.3學(xué)生成績處理實例#計算排名ranking=0forlineinxs:ranking+=1line.append(ranking)#插入標(biāo)題xs.insert(0,headLine)returnxs

#將數(shù)據(jù)對齊顯示defformatData(xs):headLine=xs[0]#標(biāo)題行補空格foriinrange(len(headLine)):headLine[i]+=int((12-len(headLine[i])*2)/2)*chr(12288)xs.pop(0)

浙江財經(jīng)大學(xué)東方學(xué)院信息分院517.3學(xué)生成績處理實例#將剩下的行對齊forlineinxs:line[0]="{:<12}".format(line[0])line[1]="{0:{1}<6}".format(line[1],chr(12288))line[2]="{:<12}".format(line[2])line[3]="{:<12}".format(line[3])line[4]="{:<12}".format(line[4])line[5]="{:<12}".format(line[5])line[6]="{:<12}".format(line[6])xs.insert(0,headLine)forlineinxs:print("".join(line))returnxs#將排名寫入file文件中defwriteData(file,xs):fo=open(file,"w")forlineinxs:fo.writelines(line)fo.write("\n")fo.close()

浙江財經(jīng)大學(xué)東方學(xué)院信息分院527.3學(xué)生成績處理實例defmain():fo=open("學(xué)生成績表.txt","r")xs=[]#處理第一行標(biāo)題行l(wèi)ine=fo.readline()line=line.replace("\n","")ls=line.split(",")xs.append(ls)

浙江財經(jīng)大學(xué)東方學(xué)院信息分院537.3學(xué)生成績處理實例#處理下面的行forlineinfo.readlines():line=line.replace("\n","")ls=line.split(",")ls[2]=eval(l

溫馨提示

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

評論

0/150

提交評論