![《數(shù)據(jù)采集與處理:基于python》 課件 第5章-文件讀寫與操作_第1頁](http://file4.renrendoc.com/view4/M02/0A/03/wKhkGGY_ZWiATZh9AACKu23hqM4876.jpg)
![《數(shù)據(jù)采集與處理:基于python》 課件 第5章-文件讀寫與操作_第2頁](http://file4.renrendoc.com/view4/M02/0A/03/wKhkGGY_ZWiATZh9AACKu23hqM48762.jpg)
![《數(shù)據(jù)采集與處理:基于python》 課件 第5章-文件讀寫與操作_第3頁](http://file4.renrendoc.com/view4/M02/0A/03/wKhkGGY_ZWiATZh9AACKu23hqM48763.jpg)
![《數(shù)據(jù)采集與處理:基于python》 課件 第5章-文件讀寫與操作_第4頁](http://file4.renrendoc.com/view4/M02/0A/03/wKhkGGY_ZWiATZh9AACKu23hqM48764.jpg)
![《數(shù)據(jù)采集與處理:基于python》 課件 第5章-文件讀寫與操作_第5頁](http://file4.renrendoc.com/view4/M02/0A/03/wKhkGGY_ZWiATZh9AACKu23hqM48765.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第一章
文件讀寫與操作《數(shù)據(jù)采集與處理:基于Python》2024/5/1112024/5/112教學(xué)目標(biāo)本章學(xué)習(xí)目標(biāo)1.了解文件的基本概念、分類、常見文件格式和基本特點(diǎn),理解不同類型文件的功能和適用范圍;2.掌握Python基本的文件操作,了解對(duì)象序列化和反序列化操作及作用;3.掌握常見結(jié)構(gòu)化數(shù)據(jù)文件(如CSV、JSON、Excel和XML)的Python基本讀寫操作方法,理解文件的內(nèi)容結(jié)構(gòu)和編碼格式;4.了解常見非結(jié)構(gòu)化數(shù)據(jù)文件(如Word、PDF、圖像等)的內(nèi)容組織格式和讀寫方法,理解用于科學(xué)數(shù)據(jù)存儲(chǔ)的HDF文件的格式、結(jié)構(gòu)特點(diǎn)及讀寫方法。本章提綱1、文件讀寫基本操作2、CSV文件讀寫3、JSON文件讀寫4、XML文件讀寫5、HDF文件讀寫6、PDF文件讀寫7、圖像文件讀寫文件讀寫基本操作2024/5/113文件的概念及分類4為了長(zhǎng)期保存數(shù)據(jù)以便重復(fù)使用、修改和共享,必須將數(shù)據(jù)以文件的形式存儲(chǔ)到外部存儲(chǔ)介質(zhì)(如磁盤、U盤、光盤或云盤、網(wǎng)盤、快盤等)中。文件操作在各類應(yīng)用軟件的開發(fā)中均占有重要的地位:管理信息系統(tǒng)是使用數(shù)據(jù)庫來存儲(chǔ)數(shù)據(jù)的,而數(shù)據(jù)庫最終還是要以文件的形式存儲(chǔ)到硬盤或其他存儲(chǔ)介質(zhì)上。應(yīng)用程序的配置信息往往也是使用文件來存儲(chǔ)的,圖形、圖像、音頻、視頻、可執(zhí)行文件等等也都是以文件的形式存儲(chǔ)在磁盤上的。文件的概念及分類5按文件中數(shù)據(jù)的組織形式把文件分為文本文件和二進(jìn)制文件兩類。文本文件:文本文件存儲(chǔ)的是常規(guī)字符串,由若干文本行組成,通常每行以換行符'\n'結(jié)尾。常規(guī)字符串是指記事本或其他文本編輯器能正常顯示、編輯并且人類能夠直接閱讀和理解的字符串,如英文字母、漢字、數(shù)字字符串。文本文件可以使用字處理軟件如gedit、記事本進(jìn)行編輯。二進(jìn)制文件:二進(jìn)制文件把對(duì)象內(nèi)容以字節(jié)串(bytes)進(jìn)行存儲(chǔ),無法用記事本或其他普通字處理軟件直接進(jìn)行編輯,通常也無法被人類直接閱讀和理解,需要使用專門的軟件進(jìn)行解碼后讀取、顯示、修改或執(zhí)行。常見的如圖形圖像文件、音視頻文件、可執(zhí)行文件、資源文件、各種數(shù)據(jù)庫文件、各類office文檔等都屬于二進(jìn)制文件。文件基本操作無論是文本文件還是二進(jìn)制文件,其操作流程基本都是一致的,首先打開文件并創(chuàng)建文件對(duì)象,然后通過該文件對(duì)象對(duì)文件內(nèi)容進(jìn)行讀取、寫入、刪除、修改等操作,最后關(guān)閉并保存文件內(nèi)容。6內(nèi)置函數(shù)open()7open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)file參數(shù)指定了被打開的文件名稱。mode參數(shù)指定了打開文件后的處理方式。buffering參數(shù)指定了讀寫文件的緩存模式。0表示不緩存,1表示緩存,如大于1則表示緩沖區(qū)的大小。默認(rèn)值是緩存模式。encoding參數(shù)指定對(duì)文本進(jìn)行編碼和解碼的方式,只適用于文本模式,可以使用Python支持的任何格式,如GBK、gb18030、gb2312、utf8、CP936等等。注意:對(duì)于中文內(nèi)容的文件,打開讀取內(nèi)容如果是亂碼,可嘗試設(shè)置encoding為對(duì)應(yīng)中文編碼格式內(nèi)置函數(shù)open()文件打開模式8模式說明r讀模式(默認(rèn)模式,可省略),如果文件不存在則拋出異常w寫模式,如果文件已存在,先清空原有內(nèi)容x寫模式,創(chuàng)建新文件,如果文件已存在則拋出異常a追加模式,不覆蓋文件中原有內(nèi)容b二進(jìn)制模式(可與其他模式組合使用)t文本模式(默認(rèn)模式,可省略)+讀、寫模式(可與其他模式組合使用)圖示圖示內(nèi)置函數(shù)open()11如果執(zhí)行正常,open()函數(shù)返回1個(gè)文件對(duì)象,通過該文件對(duì)象可以對(duì)文件進(jìn)行讀寫操作。如果指定文件不存在、訪問權(quán)限不夠、磁盤空間不足或其他原因?qū)е聞?chuàng)建文件對(duì)象失敗則拋出異常。f1=open('file1.txt','r')#以讀模式打開文件f2=open('file2.txt','w')#以寫模式打開文件當(dāng)對(duì)文件內(nèi)容操作完以后,一定要關(guān)閉文件對(duì)象,這樣才能保證所做的任何修改都確實(shí)被保存到文件中。f1.close()文件對(duì)象屬性與常用方法12方法功能說明close()把緩沖區(qū)的內(nèi)容寫入文件,同時(shí)關(guān)閉文件,并釋放文件對(duì)象flush()把緩沖區(qū)的內(nèi)容寫入文件,但不關(guān)閉文件read([size])從文本文件中讀取size個(gè)字符(Python3.x)的內(nèi)容作為結(jié)果返回,或從二進(jìn)制文件中讀取指定數(shù)量的字節(jié)并返回,如果省略size則表示讀取所有內(nèi)容readline()從文本文件中讀取一行內(nèi)容作為結(jié)果返回readlines()把文本文件中的每行文本作為一個(gè)字符串存入列表中,返回該列表seek(offset[,whence])把文件指針移動(dòng)到新的字節(jié)位置,offset表示相對(duì)于whence的位置。whence為0表示從文件頭開始計(jì)算,1表示從當(dāng)前位置開始計(jì)算,2表示從文件尾開始計(jì)算,默認(rèn)為0tell() 返回文件指針的當(dāng)前位置write(s)把s的內(nèi)容寫入文件writelines(s)把字符串列表寫入文本文件,不添加換行符上下文管理語句with在實(shí)際開發(fā)中,讀寫文件應(yīng)優(yōu)先考慮使用上下文管理語句with,關(guān)鍵字with可以自動(dòng)管理資源,不論因?yàn)槭裁丛颍呐率谴a引發(fā)了異常)跳出with塊,總能保證文件被正確關(guān)閉,并且可以在代碼塊執(zhí)行完畢后自動(dòng)還原進(jìn)入該代碼塊時(shí)的上下文,常用于文件操作、數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接、多線程與多進(jìn)程同步時(shí)的鎖對(duì)象管理等場(chǎng)合。withopen(filename,mode,encoding)asfp:#這里寫通過文件對(duì)象fp讀寫文件內(nèi)容的語句13文本文件內(nèi)容操作案例精選14例1-1
向文本文件中寫入內(nèi)容,然后再讀出。s='Helloworld\n文本文件的讀取方法\n文本文件的寫入方法\n'withopen('sample.txt','w')asfp:#默認(rèn)使用cp936編碼fp.write(s)withopen('sample.txt')asfp:#默認(rèn)使用cp936編碼print(fp.read())文本文件內(nèi)容操作案例精選例1-2
遍歷并輸出文本文件的所有行內(nèi)容。withopen('sample.txt')asfp:#假設(shè)文件采用CP936編碼forlineinfp:#文件對(duì)象可以直接迭代print(line)15文本文件內(nèi)容操作案例精選例1-3
假設(shè)文件data.txt中有若干整數(shù),每行一個(gè)整數(shù),編寫程序讀取所有整數(shù),將其按降序排序后再寫入文本文件data_asc.txt中。withopen('data.txt','r')asfp:data=fp.readlines()#讀取所有行,存入列表data=[int(item)foritemindata]#列表推導(dǎo)式,轉(zhuǎn)換為數(shù)字data.sort(reverse=True)#降序排序data=[str(item)+'\n'foritemindata]#將結(jié)果轉(zhuǎn)換為字符串#data.sort(key=int,reverse=True)#直接這樣更簡(jiǎn)潔withopen('data_desc.txt','w')asfp:#將結(jié)果寫入文件fp.writelines(data)16二進(jìn)制文件與對(duì)象序列化數(shù)據(jù)庫文件、圖像文件、可執(zhí)行文件、動(dòng)態(tài)鏈接庫文件、音頻文件、視頻文件、Office文檔等均屬于二進(jìn)制文件。對(duì)于二進(jìn)制文件,不能使用記事本或其他文本編輯軟件直接進(jìn)行正常讀寫,也不能通過Python的文件對(duì)象直接讀取和理解二進(jìn)制文件的內(nèi)容。必須正確理解二進(jìn)制文件結(jié)構(gòu)和序列化規(guī)則,然后設(shè)計(jì)正確的反序列化規(guī)則,才能準(zhǔn)確地理解二進(jìn)制文件內(nèi)容。所謂序列化,簡(jiǎn)單地說就是把內(nèi)存中的數(shù)據(jù)在不丟失其類型信息的情況下轉(zhuǎn)成二進(jìn)制形式的過程,對(duì)象序列化后的數(shù)據(jù)經(jīng)過正確的反序列化過程應(yīng)該能夠準(zhǔn)確無誤地恢復(fù)為原來的對(duì)象。Python中常用的序列化模塊有struct、pickle、shelve、marshal。17pickle模塊讀寫二進(jìn)制文件例:
使用pickle模塊寫入二進(jìn)制文件。importpicklei=13000000a=99.056s='中國(guó)人民123abc'lst=[[1,2,3],[4,5,6],[7,8,9]]tu=(-5,10,8)coll={4,5,6}dic={'a':'apple','b':'banana','g':'grape','o':'orange'}data=(i,a,s,lst,tu,coll,dic)withopen('sample_pickle.dat','wb')asf:try:pickle.dump(len(data),f)#要序列化的對(duì)象個(gè)數(shù)foritemindata:pickle.dump(item,f)#序列化數(shù)據(jù)并寫入文件except:print('寫文件異常')18pickle模塊讀寫二進(jìn)制文件例:使用pickle模塊讀取上例中二進(jìn)制文件的內(nèi)容。importpicklewithopen('sample_pickle.dat','rb')asf:n=pickle.load(f)#讀出文件中的數(shù)據(jù)個(gè)數(shù)foriinrange(n): x=pickle.load(f)#讀取并反序列化每個(gè)數(shù)據(jù)print(x)19struct模塊讀寫二進(jìn)制文件例:
使用struct模塊寫入二進(jìn)制文件。importstructn=1300000000x=96.45b=Trues='a1@中國(guó)'sn=struct.pack('if?',n,x,b)#序列化,i表示整數(shù),f表示實(shí)數(shù),?表示邏輯值withopen('sample_struct.dat','wb')asf:f.write(sn)f.write(s.encode())#字符串需要編碼為字節(jié)串再寫入文件20struct模塊讀寫二進(jìn)制文件例:
使用struct模塊讀取上例中二進(jìn)制文件的內(nèi)容。importstructwithopen('sample_struct.dat','rb')asf:sn=f.read(9)n,x,b1=struct.unpack('if?',sn)#使用指定格式反序列化print('n=',n,'x=',x,'b1=',b1)s=f.read(9).decode()print('s=',s)21shelve模塊操作二進(jìn)制文件22例:
使用shelve模塊讀寫二進(jìn)制文件。>>>importshelve>>>zhangsan={'age':38,'sex':'Male','address':'SDIBT'}>>>lisi={'age':40,'sex':'Male','qq':'1234567','tel':'7654321'}>>>withshelve.open('shelve_test.dat')asfp:
fp['zhangsan']=zhangsan#像操作字典一樣把數(shù)據(jù)寫入文件
fp['lisi']=lisi
foriinrange(5):
fp[str(i)]=str(i)shelve模塊操作二進(jìn)制文件23>>>withshelve.open('shelve_test.dat')asfp:
print(fp['zhangsan'])#讀取并顯示文件內(nèi)容
print(fp['zhangsan']['age'])
print(fp['lisi']['qq'])
print(fp['3']){'sex':'Male','address':'SDIBT','age':38}3812345673marshal模塊操作二進(jìn)制文件例:
使用marshal模塊讀寫二進(jìn)制文件,并對(duì)對(duì)象進(jìn)行序列化和反序列化操作。>>>importmarshal#導(dǎo)入模塊>>>x1=30#待序列化的對(duì)象>>>x2=5.0>>>x3=[1,2,3]>>>x4=(4,5,6)>>>x5={'a':1,'b':2,'c':3}>>>x6={7,8,9}>>>x=[eval('x'+str(i))foriinrange(1,7)]#把所有數(shù)據(jù)放入列表>>>x[30,5.0,[1,2,3],(4,5,6),{'a':1,'b':2,'c':3},{8,9,7}]>>>withopen('test.dat','wb')asfp:#創(chuàng)建二進(jìn)制文件 marshal.dump(len(x),fp)#先寫入對(duì)象個(gè)數(shù) foriteminx: marshal.dump(item,fp)#把列表中的對(duì)象依次序列化并寫入文件24marshal模塊操作二進(jìn)制文件>>>withopen('test.dat','rb')asfp:#打開二進(jìn)制文件 n=marshal.load(fp)#獲取對(duì)象個(gè)數(shù) foriinrange(n): print(marshal.load(fp))#反序列化,輸出結(jié)果305.0[1,2,3](4,5,6){'a':1,'b':2,'c':3}{8,9,7}25文件與文件夾操作26文件在計(jì)算機(jī)中一般存放到指定的文件夾中,即以目錄方式進(jìn)行管理。對(duì)文件和文件夾的操作,一般包括刪除、移動(dòng)、拷貝、粘貼、改名、檢索等。Python提供了多個(gè)文件和文件夾操作的模塊,如os、shutil等。os模塊27方法功能說明chdir(path)把path設(shè)為當(dāng)前工作目錄curdir當(dāng)前文件夾environ包含系統(tǒng)環(huán)境變量和值的字典extsep當(dāng)前操作系統(tǒng)所使用的文件擴(kuò)展名分隔符get_exec_path()返回可執(zhí)行文件的搜索路徑getcwd()返回當(dāng)前工作目錄listdir(path)返回path目錄下的文件和目錄列表os模塊28方法功能說明remove(path)刪除指定的文件,要求用戶擁有刪除文件的權(quán)限,并且文件沒有只讀或其他特殊屬性rename(src,dst)重命名文件或目錄,可以實(shí)現(xiàn)文件的移動(dòng),若目標(biāo)文件已存在則拋出異常,不能跨越磁盤或分區(qū)replace(old,new)重命名文件或目錄,若目標(biāo)文件已存在則直接覆蓋,不能跨越磁盤或分區(qū)scandir(path='.')返回包含指定文件夾中所有DirEntry對(duì)象的迭代對(duì)象,遍歷文件夾時(shí)比listdir()更加高效sep當(dāng)前操作系統(tǒng)所使用的路徑分隔符startfile(filepath[,operation])使用關(guān)聯(lián)的應(yīng)用程序打開指定文件或啟動(dòng)指定應(yīng)用程序system()啟動(dòng)外部程序os模塊>>>importos>>>importos.path>>>os.rename('C:\\dfg.txt','D:\\test2.txt')#rename()可以實(shí)現(xiàn)文件的改名和移動(dòng)>>>[fnameforfnameinos.listdir('.')iffname.endswith(('.pyc','.py','.pyw'))]#結(jié)果略>>>os.getcwd()#返回當(dāng)前工作目錄'C:\\Python35'>>>os.mkdir(os.getcwd()+'\\temp')#創(chuàng)建目錄>>>os.chdir(os.getcwd()+'\\temp')#改變當(dāng)前工作目錄>>>os.getcwd()'C:\\Python35\\temp'>>>os.mkdir(os.getcwd()+'\\test')>>>os.listdir('.')['test']>>>os.rmdir('test')#刪除目錄>>>os.listdir('.')[]29os模塊>>>os.environ.get('path')#獲取系統(tǒng)變量path的值>>>importtime>>>time.strftime('%Y-%m-%d%H:%M:%S',#查看文件創(chuàng)建時(shí)間time.localtime(os.stat('Auto.csv').st_ctime))'2016-10-1815:58:57'>>>os.startfile('notepad.exe')#啟動(dòng)記事本程序30os模塊例:
使用遞歸法遍歷指定目錄下所有子目錄和文件。fromosimportlistdirfromos.pathimportjoin,isfile,isdirdeflistDirDepthFirst(directory):'''深度優(yōu)先遍歷文件夾'''#遍歷文件夾,如果是文件就直接輸出#如果是文件夾,就輸出顯示,然后遞歸遍歷該文件夾forsubPathinlistdir(directory):path=join(directory,subPath)ifisfile(path):print(path)elifisdir(path):print(path)listDirDepthFirst(path)31os.path模塊32方法功能說明abspath(path)返回給定路徑的絕對(duì)路徑basename(path)返回指定路徑的最后一個(gè)組成部分commonpath(paths)返回給定的多個(gè)路徑的最長(zhǎng)公共路徑commonprefix(paths)返回給定的多個(gè)路徑的最長(zhǎng)公共前綴dirname(p)返回給定路徑的文件夾部分exists(path)判斷文件是否存在getatime(filename)返回文件的最后訪問時(shí)間getctime(filename)返回文件的創(chuàng)建時(shí)間getmtime(filename)返回文件的最后修改時(shí)間getsize(filename)返回文件的大小os.path模塊33方法功能說明isabs(path)判斷path是否為絕對(duì)路徑isdir(path)判斷path是否為文件夾isfile(path)判斷path是否為文件join(path,*paths)連接兩個(gè)或多個(gè)pathrealpath(path)返回給定路徑的絕對(duì)路徑relpath(path)返回給定路徑的相對(duì)路徑,不能跨越磁盤驅(qū)動(dòng)器或分區(qū)samefile(f1,f2)測(cè)試f1和f2這兩個(gè)路徑是否引用的同一個(gè)文件split(path)以路徑中的最后一個(gè)斜線為分隔符把路徑分隔成兩部分,以元組形式返回splitext(path)從路徑中分隔文件的擴(kuò)展名splitdrive(path)從路徑中分隔驅(qū)動(dòng)器的名稱os.path模塊>>>path='D:\\mypython_exp\\new_test.txt'>>>os.path.dirname(path)#返回路徑的文件夾名'D:\\mypython_exp'>>>os.path.basename(path)#返回路徑的最后一個(gè)組成部分'new_test.txt'>>>os.path.split(path)#切分文件路徑和文件名('D:\\mypython_exp','new_test.txt')>>>os.path.split('')#切分結(jié)果為空字符串('','')>>>os.path.split('C:\\windows')#以最后一個(gè)斜線為分隔符('C:\\','windows')>>>os.path.split('C:\\windows\\')('C:\\windows','')>>>os.path.splitdrive(path)#切分驅(qū)動(dòng)器符號(hào)('D:','\\mypython_exp\\new_test.txt')>>>os.path.splitext(path)#切分文件擴(kuò)展名('D:\\mypython_exp\\new_test','.txt')34shutil模塊35方法功能說明copy(src,dst)復(fù)制文件,新文件具有同樣的文件屬性,如果目標(biāo)文件已存在則拋出異常copy2(src,dst)復(fù)制文件,新文件具有原文件完全一樣的屬性,包括創(chuàng)建時(shí)間、修改時(shí)間和最后訪問時(shí)間等等,如果目標(biāo)文件已存在則拋出異常copyfile(src,dst)復(fù)制文件,不復(fù)制文件屬性,如果目標(biāo)文件已存在則直接覆蓋copyfileobj(fsrc,fdst)在兩個(gè)文件對(duì)象之間復(fù)制數(shù)據(jù),例如copyfileobj(open('123.txt'),open('456.txt','a'))copymode(src,dst)把src的模式位(modebit)復(fù)制到dst上,之后二者具有相同的模式copystat(src,dst)把src的模式位、訪問時(shí)間等所有狀態(tài)都復(fù)制到dst上copytree(src,dst)遞歸復(fù)制文件夾disk_usage(path)查看磁盤使用情況move(src,dst)移動(dòng)文件或遞歸移動(dòng)文件夾,也可以給文件和文件夾重命名rmtree(path)遞歸刪除文件夾make_archive(base_name,format,root_dir=None,base_dir=None)創(chuàng)建tar或zip格式的壓縮文件unpack_archive(filename,extract_dir=None,format=None)解壓縮壓縮文件shutil模塊下面的代碼演示了如何使用標(biāo)準(zhǔn)庫shutil的copyfile()方法復(fù)制文件。>>>importshutil#導(dǎo)入shutil模塊>>>shutil.copyfile('C:\\dir.txt','C:\\dir1.txt')#復(fù)制文件下面的代碼將C:\Python35\Dlls文件夾以及該文件夾中所有文件壓縮至D:\a.zip文件:>>>shutil.make_archive('D:\\a','zip','C:\\Python35','Dlls')'D:\\a.zip'下面的代碼將剛壓縮得到的文件D:\a.zip解壓縮至D:\a_unpack文件夾:>>>shutil.unpack_archive('D:\\a.zip','D:\\a_unpack')下面的代碼使用shutil模塊的方法刪除剛剛解壓縮得到的文件夾:>>>shutil.rmtree('D:\\a_unpack')36shutil模塊下面的代碼使用shutil的copytree()函數(shù)遞歸復(fù)制文件夾,并忽略擴(kuò)展名為pyc的文件和以“新”字開頭的文件和子文件夾:>>>fromshutilimportcopytree,ignore_patterns>>>copytree('C:\\python35\\test','D:\\des_test',ignore=ignore_patterns('*.pyc','新*'))37綜合案例解析例:
把指定文件夾中的所有文件名批量隨機(jī)化,保持文件類型不變。fromstringimportascii_lettersfromosimportlistdir,renamefromos.pathimportsplitext,joinfromrandomimportchoice,randintdefrandomFilename(directory):forfninlistdir(directory):#切分,得到文件名和擴(kuò)展名name,ext=splitext(fn)n=randint(5,20)#生成隨機(jī)字符串作為新文件名newName=''.join((choice(ascii_letters)foriinrange(n)))#修改文件名rename(join(directory,fn),join(directory,newName+ext))randomFilename('C:\\test')38CSV文件操作2024/5/1139最簡(jiǎn)單的(也是結(jié)構(gòu)最少的)是CSV-逗號(hào)分隔值(Comma-SeparatedValues文件,有時(shí)也稱為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào),可以是制表符、分號(hào)、冒號(hào)等。CSV不是一種正式的文件格式,而是一個(gè)以文本文件表示的表,其中單元格由分隔符分隔。通常,第一行表示標(biāo)題。純文本意味著該文件是一個(gè)字符序列,不含必須像二進(jìn)制數(shù)字那樣被解讀的數(shù)據(jù)?!癈SV”并不是一種單一的、定義明確的格式(盡管RFC4180有一個(gè)被通常使用的定義)。因此在實(shí)踐中,術(shù)語“CSV”泛指具有以下特征的任何文件:純文本,使用某個(gè)字符集,比如ASCII、Unicode、EBCDIC或GB2312;由記錄組成(典型的是每行一條記錄);每條記錄被分隔符分隔為字段(典型分隔符有逗號(hào)、分號(hào)或制表符;有時(shí)分隔符可以包括可選的空格);每條記錄都有同樣的字段序列。CSV文件簡(jiǎn)介CSV規(guī)則:開頭是不留空,以行為單位。可含或不含列名,含列名則居文件第一行。一行數(shù)據(jù)不跨行,無空行。以半角逗號(hào)(即,)作分隔符,列為空也要表達(dá)其存在。列內(nèi)容如存在半角引號(hào)(即"),替換成半角雙引號(hào)("")轉(zhuǎn)義,即用半角引號(hào)(即"")將該字段值包含起來。文件讀寫時(shí)引號(hào),逗號(hào)操作規(guī)則互逆。內(nèi)碼格式不限,可為ASCII、Unicode或者其他。不支持?jǐn)?shù)字不支持特殊字符CSV文件簡(jiǎn)介CSV格式例子,如本書配套練習(xí)文件hit_albums.csv:Artist,Album,GenreMichaelJackson,Bad,Pop,funk,rock在這里,Album是由逗號(hào)分隔的多種Genre。但是,逗號(hào)也用于分隔各個(gè)列。為了解決這個(gè)問題,通常使用雙引號(hào)來表示引號(hào)中包含的所有元素都不是定界符:Artist,Album,GenreMichaelJackson,Bad,"Pop,funk,rock"現(xiàn)在,可以清楚Pop,funk,rock應(yīng)該屬于一個(gè)單元CSV文件簡(jiǎn)介讀取CSV文件有多種方法。可以使用Python的基本文件讀(和寫)操作,也可以使用CSV模塊讀寫,還可以使用Pandas模塊對(duì)CSV文件內(nèi)容更便捷地讀寫操作。Pandas模塊提供了多種數(shù)據(jù)源的操作方法,如CSV、JSON、HDF、Excel、HTML甚至關(guān)系數(shù)據(jù)庫等。2.2CSV文件讀寫Python3中的默認(rèn)的編碼解碼方式為utf-8Windows系統(tǒng)默認(rèn)使用的編碼方式為gbk當(dāng)讀取一個(gè)Windows文件(gbk),可以指定讀取時(shí)使用的編碼encoding=('gbk')或者不需要指定。當(dāng)Python寫入文件時(shí),默認(rèn)使用的utf-8編碼,在Windows上打開會(huì)亂碼,因?yàn)閃indows默認(rèn)編碼是gbk#Python內(nèi)置open函數(shù)打開文件albums_file=open('hit_albums.csv','r',encoding=('utf-8'))#通過文件對(duì)象的read函數(shù)一次性讀取所有文件內(nèi)容content=albums_file.read()#注意:行以特殊字符、換行符或換行符結(jié)束\n.如果打印出來,\n會(huì)被翻譯為新行print(content)#在讀取文件之后,我們必須再次手動(dòng)關(guān)閉它以釋放操作系統(tǒng)資源:albums_file.close()2.2.1基本文件操作方法或者,我們可以分別讀取每一行:albums_file=open('hit_albums.csv','r',encoding='utf-8')line1=albums_file.readline();print(line1)#輸出:Artist,Album,Released,Genre,"Certifiedsales(millions)",Claimedsales(millions)#字符串的split函數(shù),可以指定分隔符拆分字符串line1.split(",")2.2.1基本文件操作方法可以循環(huán)讀取文件內(nèi)容到數(shù)組中:2.2.1基本文件操作方法data=[]forlineinalbums_file:data.append(line.split(","))
#let'snotforgettoclosethefile:albums_file.close()print(data)#讀取單個(gè)行與單元data[0][1]print(data[0])我們可以使用"w"標(biāo)識(shí)打開文件寫入操作.這里我們也使用with關(guān)鍵字,即使出現(xiàn)問題,它也會(huì)為我們關(guān)閉文件:withopen('my_file.txt','w')asnew_file:new_file.write("HelloWorld\nAreyoustillspinning?\n")a=""2.2.1基本文件操作方法我們可以使用CSV庫來幫助讀取數(shù)據(jù)。它接受一個(gè)“delimiter”和一個(gè)“quotechar”參數(shù),后者對(duì)我們的雙引號(hào)非常有用:2.2.2CSV模塊讀寫CSV文件importcsv#導(dǎo)入csv庫
data_values=[]#初始化頂級(jí)數(shù)組
#打開文件并把行數(shù)據(jù)作為數(shù)組追加到data_values中.如果出現(xiàn)亂碼,需要在open函數(shù)中設(shè)置encoding參數(shù)withopen('hit_albums.csv',encoding="utf-8")ascsvfile:#請(qǐng)注意,通常我們可以互換使用'和"#對(duì)于quotechar,我們使用'以便我們可以使用"而不用轉(zhuǎn)義filereader=csv.reader(csvfile,delimiter=',',quotechar='"')forrowinfilereader:#這里的行是個(gè)數(shù)組
print("Row:"+str(row))data_values.append(row)
#保存頭數(shù)據(jù)(header,對(duì)應(yīng)列名)到單獨(dú)的數(shù)組中header=data_values.pop(0)print("Headeris:",header)print("data_valuesis:",data_values)使用CSV庫寫入CSV文件:CSV模塊讀寫CSV文件importcsvwithopen('test.csv','w')asf:writer=csv.writer(f)#寫入表頭,表頭是單行數(shù)據(jù)writer.writerow(['name','age','sex'])data=[('huangyuan',20,'male'),('zhanglan',22,'female')]#寫入這些多行數(shù)據(jù)writer.writerows(data)相比CSV庫,Pandas庫的read_csv或read_table方法讀取CSV文件更方便快捷。Pandas模塊讀寫CSV文件#Pandas的read_csv函數(shù)。Pandas從數(shù)據(jù)源讀取數(shù)據(jù)的函數(shù),基本都是以read_開頭importpandasaspdhit_albums=pd.read_csv("hit_albums.csv")hit_albums.head()#缺省查看頭5行還可以使用read_table函數(shù),讀取空格或分隔符分隔的數(shù)據(jù),效果與read_csv函數(shù)一樣。Pandas模塊讀寫CSV文件hit_albums_table=pd.read_table('hit_albums.csv',sep=',')print(type(hit_albums_table))hit_albums_table.head()反之,還可以使用to_開頭的函數(shù),將文件DataFrame數(shù)據(jù)寫入文件。hit_albums.to_csv("dfout-test1.csv")#帶有索引hit_albums.to_csv("dfout-test2.csv",index=None)#不帶索引hit_albums.to_csv("dfout-test3.csv",index=None,header=False)#不帶索引,不帶列名頭如果讀取文件太大,需要考慮分塊讀取及顯示部分內(nèi)容。如:pd.options.display.max_rows=10,read_csv函數(shù)設(shè)置一次讀取數(shù)量的參數(shù),如nrows限定讀取行數(shù);chunksize分批次處理文件,每次處理多少數(shù)據(jù)Pandas模塊讀寫CSV文件pd.options.display.max_rows=20hit_albums=pd.read_csv("hit_albums.csv",nrows=6)print(hit_albums)#有chunksize,返回的就是TextFileReader對(duì)象,需要循環(huán)處理每批次返回的數(shù)據(jù)hit_albums_table=pd.read_table('hit_albums.csv',chunksize=3)#chunksize參數(shù)是指每次讀取塊的行數(shù)#hit_albums_table=pd.read_table('hit_albums.csv',sep=',',chunksize=3)print(type(hit_albums_table))#print("遍歷前轉(zhuǎn)換列表:",list(enumerate(hit_albums_table)))#hit_albums_table是個(gè)迭代器類型,遍歷一次則為空#print("再次遍歷內(nèi)容:")forindex,datainenumerate(hit_albums_table):ifindex<5:print(data)XML文件讀寫2024/5/1153XML簡(jiǎn)介1.XML概述XML(ExtensibleMarkupLanguage,簡(jiǎn)稱XML),即可擴(kuò)展標(biāo)記語言,是互聯(lián)網(wǎng)數(shù)據(jù)傳輸?shù)闹匾ぞ撸梢钥缭交ヂ?lián)網(wǎng)任何平臺(tái),不受編程語言和操作系統(tǒng)限制,是互聯(lián)網(wǎng)異構(gòu)應(yīng)用數(shù)據(jù)共享的主要標(biāo)準(zhǔn)規(guī)范。XML表示數(shù)據(jù)結(jié)構(gòu)化良好,自解釋能力強(qiáng),有助于在服務(wù)器之間共享傳輸結(jié)構(gòu)化數(shù)據(jù),便于開發(fā)人員控制數(shù)據(jù)的存儲(chǔ)和傳輸。XML用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對(duì)自己的標(biāo)記語言進(jìn)行定義的源語言。XML是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)的子集,非常適合Web傳輸。XML提供統(tǒng)一的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。54XML簡(jiǎn)介2.XML特點(diǎn)與作用擴(kuò)展性:允許使用者自定義的標(biāo)記來描述數(shù)據(jù)。自描述性:容易閱讀,可以使用XML語言來定義特定的文檔模式,以檢驗(yàn)XML文檔是否滿足特定要求??缙脚_(tái):獨(dú)立于操作系統(tǒng)、開發(fā)語言和不同應(yīng)用,方便網(wǎng)絡(luò)傳輸和異構(gòu)系統(tǒng)之間共享數(shù)據(jù)。語法簡(jiǎn)潔:用SGML的20%的復(fù)雜性,保留了80%的功能。方便定義新的規(guī)范:使用XML可以創(chuàng)造符合某一特定領(lǐng)域的數(shù)據(jù)描述標(biāo)簽,以滿足特定領(lǐng)域數(shù)據(jù)描述的需要。例如Spring開源框架的配置文件、ebXML(電子商務(wù)領(lǐng)域XML)、WebServices中的系列規(guī)范等?;赬ML上述特點(diǎn)和優(yōu)點(diǎn),XML常用于配置應(yīng)用程序和網(wǎng)站、網(wǎng)頁數(shù)據(jù)表示、異構(gòu)程序數(shù)據(jù)交互與Ajax基石,還經(jīng)常用來定義新的語言規(guī)范和數(shù)據(jù)共享規(guī)范等。55XML簡(jiǎn)介3.XML的聲明XML聲明一般是XML文檔的第一行,如簡(jiǎn)單的XML文檔聲明:<?xmlversion="1.0"?>。XML區(qū)別大小寫,其聲明一般包括由以下幾個(gè)部分:version屬性:說明當(dāng)前XML文檔的版本,一般寫為1.0,version屬性是必須的;encoding屬性:說明當(dāng)前XML文檔使用的字符編碼集,XML解析器會(huì)使用這個(gè)編碼來解析XML文檔。encoding屬性是可選的,默認(rèn)為UTF-8。注意,如果XML文檔使用的字符編碼集和encoding屬性值不同,則會(huì)導(dǎo)致亂碼或解析錯(cuò)誤。standalone屬性:說明當(dāng)前XML文檔是否為獨(dú)立文檔,默認(rèn)值為yes。如果該屬性值為yes,表示當(dāng)前XML文檔是獨(dú)立的,如果為no表示當(dāng)前XML文檔不是獨(dú)立的,即依賴外部的約束文件。56XML簡(jiǎn)介4.根元素它是XML文檔里面唯一的;它的開始是放在最前面,結(jié)束是放在最后面。5.元素(1)所有的XML元素都必須有結(jié)束標(biāo)簽;(2)XML標(biāo)簽對(duì)大小寫敏感;(3)XML必須正確地嵌套;(4)元素的命名規(guī)則:名稱中可以包含字母、數(shù)字或者其他的字符;名稱不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開始;名稱中不能包含空格。(5)空元素6.屬性(1)語法<元素名屬性名=“屬性值”/>。例如:<Name>Tom</Name>(2)注意屬性值用雙引號(hào)包裹;一個(gè)元素可以有多個(gè)屬性,它的基本格式為:<元素名屬性名=“屬性值”屬性名=“屬性值”>;屬性值中不能夠直接包含<.”,&。57XML簡(jiǎn)介7.實(shí)體語法形式為:<!ENTITY實(shí)體名稱"實(shí)體的值">。XML中5個(gè)預(yù)定義實(shí)體。。8.注釋注釋的內(nèi)容會(huì)被程序忽略而不做解釋和處理。注釋方法為:<!--注釋內(nèi)容-->。注意:注釋內(nèi)容中不要出現(xiàn)”--”;不能把注釋放在標(biāo)簽中間;注釋不能嵌套。9.命名空間在XML中,元素名稱可能是由不同開發(fā)者定義的,當(dāng)兩個(gè)不同的文檔使用相同的元素名時(shí),就會(huì)發(fā)生命名沖突。XML命名空間則提供了避免元素命名沖突的方法,通過使用名稱前綴從而容易地避免。當(dāng)在XML中使用前綴時(shí),用于前綴的命名空間必須被定義。命名空間是在元素的開始標(biāo)簽的xmlns屬性中定義的。命名空間聲明的語法如下。xmlns:前綴="URI"。當(dāng)命名空間被定義在元素的開始標(biāo)簽中時(shí),所有帶有相同前綴的子元素都會(huì)與同一個(gè)命名空間相關(guān)聯(lián)。58XML簡(jiǎn)介定義XML數(shù)據(jù)時(shí),需要注意保持格式良好及有效性,而有效的(valid)XML文檔,首先是個(gè)格式良好規(guī)范的XML文檔,然后又需要滿足DTD(DataTypeDefinition的縮寫)的要求。遵循如下規(guī)則的XML文檔稱為格式良好的XML文檔:必須有XML聲明語句;必須有且僅有一個(gè)根元素;標(biāo)簽大小寫敏感;屬性值用雙引號(hào);標(biāo)簽成對(duì);空標(biāo)簽關(guān)閉;元素正確嵌套。59XML讀寫1.lxml模塊安裝Python工具需要安裝lxml模塊,安裝方法:condainstalllxmlpipinstallbeautifulsoup4html5lib或者:pipinstallbs42.讀寫示例60fromlxmlimportobjectify
path='Performance_MNR.xml'parsed=objectify.parse(open(path))print(parsed)root=parsed.getroot()#返回的是文檔對(duì)象模型DOM數(shù)據(jù)結(jié)構(gòu)data=[]skip_fields=['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES']foreltinroot.INDICATOR:el_data={}#以字典形式存儲(chǔ)每行記錄數(shù)據(jù)forchildinelt.getchildren():ifchild.taginskip_fields:continueel_data[child.tag]=child.pyvaldata.append(el_data)#多行記錄以列表形式存儲(chǔ)perf=pd.DataFrame(data)perf.head()JSON文件操作2024/5/1161JSON簡(jiǎn)介1.JSON簡(jiǎn)介JSON(JavaScriptObjectNotation)是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C,C++,C#,Java,JavaScript,Perl,Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。JSON是DouglasCrockford在2001年開始推廣使用的數(shù)據(jù)格式,在2005年-2006年正式成為主流的數(shù)據(jù)格式,雅虎和谷歌就在那時(shí)候開始廣泛地使用JSON格式。JSON語法規(guī)則在JS語言中,一切都是對(duì)象。因此,任何支持的類型都可以通過JSON來表示,例如字符串、數(shù)字、對(duì)象、數(shù)組等。但是對(duì)象和數(shù)組是比較特殊且常用的兩種類型:對(duì)象表示為鍵值對(duì)數(shù)據(jù)由逗號(hào)分隔花括號(hào)保存對(duì)象方括號(hào)保存數(shù)組JSON簡(jiǎn)介JSON建構(gòu)于兩種結(jié)構(gòu):(1)“名稱/值”對(duì)的集合(Acollectionofname/valuepairs)。不同的語言中,它被理解為對(duì)象(object),紀(jì)錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hashtable),有鍵列表(keyedlist),或者關(guān)聯(lián)數(shù)組(associativearray)。(2)值的有序列表(Anorderedlistofvalues)。在大部分語言中,它被理解為數(shù)組(array)。JSON與JS對(duì)象的關(guān)系JSON是JS對(duì)象的字符串表示法,它使用文本表示一個(gè)JS對(duì)象的信息,本質(zhì)是一個(gè)字符串。如varobj={a:'Hello',b:'World'};//這是一個(gè)對(duì)象,注意鍵名也是可以使用引號(hào)包裹的varjson='{"a":"Hello","b":"World"}';//這是一個(gè)JSON字符串,本質(zhì)是一個(gè)字符串2.基礎(chǔ)示例簡(jiǎn)單地說,JSON可以將JavaScript對(duì)象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在函數(shù)之間輕松地傳遞這個(gè)字符串,或者在異步應(yīng)用程序中將字符串從Web客戶機(jī)傳遞給服務(wù)器端程序。這個(gè)字符串看起來有點(diǎn)兒古怪,但是JavaScript很容易解釋它,而且JSON可以表示比"名稱/值"對(duì)更復(fù)雜的結(jié)構(gòu)。例如,可以表示數(shù)組和復(fù)雜的對(duì)象,而不僅僅是鍵和值的簡(jiǎn)單列表。3.1JSON簡(jiǎn)介表示名稱/值對(duì)按照最簡(jiǎn)單的形式,可以用下面這樣的JSON表示"名稱/值"對(duì):{"firstName":"Brett"}。這個(gè)示例非?;?,而且實(shí)際上比等效的純文本"名稱/值"對(duì)占用更多的空間:firstName=Brett但是,當(dāng)將多個(gè)"名稱/值對(duì)"串在一起時(shí),JSON就會(huì)體現(xiàn)出它的價(jià)值了。首先,可以創(chuàng)建包含多個(gè)"名稱/值"對(duì)的記錄,比如:{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}從語法方面來看,這與"名稱/值"對(duì)相比并沒有很大的優(yōu)勢(shì),但是在這種情況下JSON更容易使用,而且可讀性更好。例如,它明確地表示以上三個(gè)值都是同一記錄的一部分;花括號(hào)使這些值有了某種聯(lián)系。表示數(shù)組當(dāng)需要表示一組值時(shí),JSON不但能夠提高可讀性,而且可以減少復(fù)雜性。例如,假設(shè)您希望表示一個(gè)人名列表。在XML中,需要許多開始標(biāo)記和結(jié)束標(biāo)記;如果使用典型的名稱/值對(duì)(就像在本系列前面文章中看到的那種名稱/值對(duì)),那么必須建立一種專有的數(shù)據(jù)格式,或者將鍵名稱修改為person1-firstName這樣的形式。JSON簡(jiǎn)介如果使用JSON,就只需將多個(gè)帶花括號(hào)的記錄分組在一起:JSON簡(jiǎn)介{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]}JSON簡(jiǎn)介{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}],"authors":[{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}],"musicians":[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]}3.1JSON簡(jiǎn)介3.與XML比較1)可讀性JSON和XML的可讀性可謂不相上下,一邊是簡(jiǎn)易的語法,一邊是規(guī)范的標(biāo)簽形式,很難分出勝負(fù)。2)可擴(kuò)展性XML天生有很好的擴(kuò)展性,JSON當(dāng)然也有,沒有什么是XML可以擴(kuò)展而JSON卻不能擴(kuò)展的。不過JSON在Javascript主場(chǎng)作戰(zhàn),可以存儲(chǔ)Javascript復(fù)合對(duì)象,有著xml不可比擬的優(yōu)勢(shì)。3)編碼難度XML有豐富的編碼工具,比如Dom4j、Dom、SAX等,JSON也有提供的工具。無工具的情況下,相信熟練的開發(fā)人員一樣能很快的寫出想要的xml文檔和JSON字符串,不過,xml文檔要多很多結(jié)構(gòu)上的字符。4)解碼難度XML的解析方式有兩種:一是通過文檔模型解析,也就是通過父標(biāo)簽索引出一組標(biāo)記。例如:xmlData.getElementsByTagName(“tagName”),但是需要預(yù)先知道文檔結(jié)構(gòu)的情況下使用。二是遍歷節(jié)點(diǎn)(document以及childNodes),可以通過遞歸來實(shí)現(xiàn),不過解析出來的數(shù)據(jù)仍舊是形式各異。凡是這樣可擴(kuò)展的結(jié)構(gòu)數(shù)據(jù)解析起來一定都很困難。JSON也同樣如此。<?xmlversion="1.0"encoding="utf-8"?><country><name>中國(guó)</name><province><name>黑龍江</name><cities><city>哈爾濱</city><city>大慶</city></cities></province><province><name>廣東</name><cities><city>廣州</city><city>深圳</city><city>珠海</city></cities></province><province><name>臺(tái)灣</name><cities><city>臺(tái)北</city><city>高雄</city></cities></province><province><name>新疆</name><cities><city>烏魯木齊</city></cities></province></country>{"name":"中國(guó)","province":[{"name":"黑龍江","cities":{"city":["哈爾濱","大慶"]}},{"name":"廣東","cities":{"city":["廣州","深圳","珠海"]}},{"name":"臺(tái)灣","cities":{"city":["臺(tái)北","高雄"]}},{"name":"新疆","cities":{"city":["烏魯木齊"]}}]}XML與JSON格式比較:左邊為XML,右邊為JSONJSON簡(jiǎn)介JSON讀寫1.使用json模塊操作json數(shù)據(jù)#對(duì)于較長(zhǎng)的字符串,需要使用""""""obj="""{"name":"Wes","places_lived":["UnitedStates","Spain","Germany"],"pet":null,"siblings":[{"name":"Scott","age":30,"pets":["Zeus","Zuko"]},{"name":"Katie","age":38,"pets":["Sixes","Stache","Cisco"]}]}"""importjsonresult=json.loads(obj)result#結(jié)果為字典結(jié)構(gòu)#將json對(duì)象序列化asjson=json.dumps(result)print(asjson)JSON讀寫2.使用Pandas模塊操作JSON數(shù)據(jù)read_json函數(shù)語法:pandas.read_json(path_or_buf=None,orient=None,typ='frame',dtype=True,convert_axes=True,convert_dates=True,keep_default_dates=True,numpy=False,precise_float=False,date_unit=None,encoding=None,lines=False,chunksize=None,compression='infer')第一參數(shù)就是json文件路徑或者json格式的字符串。第二參數(shù)orient是表明預(yù)期的json字符串格式。orient的設(shè)置有以下幾個(gè)值:像字典的'split',像列表的'records','index','columns','values'等。importpandasaspddata=pd.read_json("Sample.json")print(data)#將DataFrame數(shù)據(jù)輸出為json格式print(data.to_json())#索引形式print("記錄形式:",data.to_json(orient='records'))#記錄形式HDF文件操作2024/5/11725.1
HDF簡(jiǎn)介1.什么是HDFHDF(即HierarchicalDataFormat的縮寫,可譯為層次化數(shù)據(jù)結(jié)構(gòu))是包含多種信息的一個(gè)單文件,所有的信息放在同一個(gè)文件中。在HDF通過特定文件結(jié)構(gòu)來存儲(chǔ)多種不同信息。HDF是用于存儲(chǔ)和分發(fā)科學(xué)數(shù)據(jù)的一種自我描述、多對(duì)象文件格式。HDF是由美國(guó)國(guó)家超級(jí)計(jì)算應(yīng)用中心(NCSA)創(chuàng)建的,以滿足不同群體的科學(xué)家在不同工程項(xiàng)目領(lǐng)域之需要。HDF可以表示出科學(xué)數(shù)據(jù)存儲(chǔ)和分布的許多必要條件。HDF被設(shè)計(jì)為:自述性:對(duì)于一個(gè)HDF文件里的每一個(gè)數(shù)據(jù)對(duì)象,有關(guān)于該數(shù)據(jù)的綜合信息(元數(shù)據(jù))。在沒有任何外部信息的情況下,HDF允許應(yīng)用程序解釋HDF文件的結(jié)構(gòu)和內(nèi)容。通用性:許多數(shù)據(jù)類型都可以被嵌入在一個(gè)HDF文件里。例如,通過使用合適的HDF數(shù)據(jù)結(jié)構(gòu),符號(hào)、數(shù)字和圖形數(shù)據(jù)可以同時(shí)存儲(chǔ)在一個(gè)HDF文件里。靈活性:HDF允許用戶把相關(guān)的數(shù)據(jù)對(duì)象組合在一起,放到一個(gè)分層結(jié)構(gòu)中,向數(shù)據(jù)對(duì)象添加描述和標(biāo)簽。它還允許用戶把科學(xué)數(shù)據(jù)放到多個(gè)HDF文件里。擴(kuò)展性:HDF極易容納將來新增加的數(shù)據(jù)模式,容易與其他標(biāo)準(zhǔn)格式兼容。跨平臺(tái)性:HDF是一個(gè)與平臺(tái)無關(guān)的文件格式。HDF文件無需任何轉(zhuǎn)換就可以在不同平臺(tái)上使用。735.1
HDF簡(jiǎn)介2.HDF基本數(shù)據(jù)類型HDF提供6種基本數(shù)據(jù)類型:光柵圖像(RasterImage),調(diào)色板(Palette),科學(xué)數(shù)據(jù)集(ScientificDataSet),注解(Annotation),虛擬數(shù)據(jù)(Vdata)和虛擬組(Vgrou?p)。3.HDF文件格式最好的辦法是把HDF文件看成為一本多章節(jié)書。HDF文件是“數(shù)據(jù)書”,其中每章都包含一個(gè)不同類型的數(shù)據(jù)內(nèi)容。正如書籍用一個(gè)目錄表列出它的章節(jié)一樣,HDF文件用“dataindex”(數(shù)據(jù)索引)列出其數(shù)據(jù)內(nèi)容HDF文件結(jié)構(gòu)包括一個(gè)fileid(文件號(hào))、至少一個(gè)datadescriptor(數(shù)據(jù)描述符)、沒有或多個(gè)dataelement(數(shù)據(jù)內(nèi)容)數(shù)據(jù)內(nèi)容。745.2
HDF讀寫Python中經(jīng)常用于儲(chǔ)存神經(jīng)網(wǎng)絡(luò)訓(xùn)練模型和相關(guān)參數(shù),對(duì)應(yīng)專用模塊有h5py、pandas模塊。支持查看編輯h5文件內(nèi)容,可使用軟件HDFView。75importpandasaspdimportnumpyasnpframe=pd.DataFrame({'a':np.random.randn(100)})#創(chuàng)建HDF存儲(chǔ)對(duì)象storestore=pd.HDFStore('mydata.h5')store['obj1']=framestore['obj1_col']=frame['a']store['obj1'].head()#HDF存儲(chǔ)對(duì)象操作與寫入store.put('obj2',frame,format='table')aa=store.select('obj2',where=['index>=10andindex<=15'])store.close()#DataFrame對(duì)象的hdf格式文件的讀寫操作frame.to_hdf('mydata.h5','obj3',format='table')pd.read_hdf('mydata.h5','obj3',where=['index<5'])Office文件操作2024/5/11766.1
Word文件讀寫使用擴(kuò)展庫docx讀寫Word2007以及更高版本的文件。77
fromdocximportDocumentimportre
result={'li':[],'fig':[],'tab':[]}doc=Document(r'C:\Python可以這樣學(xué).docx')
forpindoc.paragraphs:#遍歷文檔所有段落t=p.text#獲取每一段的文本ifre.match('例\d+-\d+',t):#例題result['li'].append(t)elifre.match('圖\d+-\d+',t):#插圖result['fig'].append(t)elifre.match('表\d+-\d+',t):#表格result['tab'].append(t)
forkeyinresult.keys():#輸出結(jié)果print('='*30)forvalueinresult[key]:print(value)6.2
Excel文件讀寫可以使用擴(kuò)展庫openpyxl讀寫Excel2007以及更高版本的文件。Pandas的to_excel和read_excel函數(shù)也可以讀寫Excel文件,讀寫時(shí)候需要注意編碼格式encoding、表單號(hào)sheet、表頭head.下面是對(duì)應(yīng)Pandas的函數(shù)形式:1.to_excel(excel_writer,sheet_name='Sheet1',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep='inf',verbos
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個(gè)人房屋租賃的合同(2篇)
- 2025年個(gè)人房屋買賣協(xié)議參考模板(2篇)
- 2025年二手房轉(zhuǎn)讓房產(chǎn)協(xié)議范文(2篇)
- 2025年五年級(jí)上班隊(duì)工作總結(jié)(二篇)
- 2025年主要農(nóng)作物新品種展示示范協(xié)議(6篇)
- 大型機(jī)械拆卸運(yùn)輸合同
- 兒童樂園對(duì)公裝修合同
- 鐵路熱熔標(biāo)線施工方案
- 賓館改造瓦工單包合同
- 化妝品快遞配送合同范本
- 行政區(qū)域代碼表Excel
- 少兒財(cái)商教育少兒篇
- GB 1886.114-2015食品安全國(guó)家標(biāo)準(zhǔn)食品添加劑紫膠(又名蟲膠)
- 初二上冊(cè)期末數(shù)學(xué)試卷含答案
- envi二次開發(fā)素材包-idl培訓(xùn)
- 2022年上海市初中語文課程終結(jié)性評(píng)價(jià)指南
- 西門子starter軟件簡(jiǎn)易使用手冊(cè)
- 隧道施工監(jiān)控量測(cè)方案及措施
- 桂花-作文ppt-PPT課件(共14張)
- 配電房日常檢查記錄表.docx
- 高一數(shù)學(xué)概率部分知識(shí)點(diǎn)總結(jié)及典型例題解析 新課標(biāo) 人教版 必修
評(píng)論
0/150
提交評(píng)論