Python文件操作教程,Python文件操作筆記_第1頁
Python文件操作教程,Python文件操作筆記_第2頁
Python文件操作教程,Python文件操作筆記_第3頁
Python文件操作教程,Python文件操作筆記_第4頁
Python文件操作教程,Python文件操作筆記_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、文件的打開與關(guān)閉想一想:如果想用word編寫一份簡歷,應(yīng)該有哪些流程呢?打開word軟件,新建一個word文件寫入個人簡歷信息保存文件關(guān)閉word軟件同樣,在操作文件的整體過程與使用word編寫一份簡歷的過程是很相似的打開文件,或者新建立一個文件讀/寫數(shù)據(jù)關(guān)閉文件打開文件在python,使用open函數(shù),可以打開一個已經(jīng)存在的文件,或者創(chuàng)建一個新文件open(文件路徑,訪問模式)示例如下:f = open(test.txt, w)說明:文件路徑文件的路徑分為相對路徑和絕對路徑兩種。絕對路徑:指的是絕對位置,完整地描述了目標(biāo)的所在地,所有目錄層級關(guān)系是一目了然的。例如:C:/Users/chri

2、s/AppData/Local/Programs/Python/Python37/python.exe,從電腦的盤符開始,表示的就是一個絕對路徑。相對路徑:是從當(dāng)前文件所在的文件夾開始的路徑。test.txt,是在當(dāng)前文件夾查找test.txt文件./test.txt,也是在當(dāng)前文件夾里查找test.txt文件,./表示的是當(dāng)前文件夾。./test.txt,從當(dāng)前文件夾的上一級文件夾里查找test.txt文件。./表示的是上一級文件夾demo/test.txt,在當(dāng)前文件夾里查找demo這個文件夾,并在這個文件夾里查找test.txt文件。訪問模式:訪問模式說明r以只讀方式打開文件。文件的指針

3、將會放在文件的開頭。如果文件不存在,則報錯。這是默認(rèn)模式。w打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。a打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結(jié)尾。也就是說,新的內(nèi)容將會被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入。r+打開一個文件用于讀寫。文件指針將會放在文件的開頭。w+打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。a+打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結(jié)尾。文件打開時會是追加模式。如果該文件不存在,創(chuàng)建新文件用于讀寫。rb以二進(jìn)制格式打開一個文件用于只

4、讀。文件指針將會放在文件的開頭。wb以二進(jìn)制格式打開一個文件只用于寫入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。ab以二進(jìn)制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結(jié)尾。也就是說,新的內(nèi)容將會被寫入到已有內(nèi)容之后。如果該文件不存在,創(chuàng)建新文件進(jìn)行寫入。rb+以二進(jìn)制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。wb+以二進(jìn)制格式打開一個文件用于讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng)建新文件。ab+以二進(jìn)制格式打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結(jié)尾。如果該文件不存在,創(chuàng)建新文件用于讀寫。關(guān)閉文件clo

5、se( )示例如下:# 新建一個文件,文件名為:test.txtf = open(test.txt, w)# 關(guān)閉這個文件f.close()文件的讀寫寫數(shù)據(jù)(write)使用write()可以完成向文件寫入數(shù)據(jù)demo: 新建一個文件file_write_test.py,向其中寫入如下代碼:f = open(test.txt, w)f.write(hello world, i am here!n * 5)f.close()運行之后會在file_write_test.py文件所在的路徑中創(chuàng)建一個文件test.txt,并寫入內(nèi)容,運行效果顯示如下:注意:如果文件不存在,那么創(chuàng)建;如果存在那么就先清

6、空,然后寫入數(shù)據(jù)讀數(shù)據(jù)(read)使用read(num)可以從文件中讀取數(shù)據(jù),num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié)),如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)demo: 新建一個文件file_read_test.py,向其中寫入如下代碼:f = open(test.txt, r)content = f.read(5) # 最多讀取5個數(shù)據(jù)print(content)print(-*30) # 分割線,用來測試content = f.read() # 從上次讀取的位置繼續(xù)讀取剩下的所有的數(shù)據(jù)print(content)f.close() # 關(guān)閉文件,這個可是個好習(xí)慣哦運行

7、現(xiàn)象:hello- world, i am here!注意:如果用open打開文件時,如果使用的r,那么可以省略open(test.txt)讀數(shù)據(jù)(readline)readline只用來讀取一行數(shù)據(jù)。f = open(test.txt, r)content = f.readline()print(1:%s % content)content = f.readline()print(2:%s % content)f.close()讀數(shù)據(jù)(readlines)readlines可以按照行的方式把整個文件中的內(nèi)容進(jìn)行一次性讀取,并且返回的是一個列表,其中每一行為列表的一個元素。f = open(t

8、est.txt, r)content = f.readlines()print(type(content)for temp in content: print(temp)f.close()指針定位tell() 方法用來顯示當(dāng)前指針的位置f = open(test.txt)print(f.read(10) # read 指定讀取的字節(jié)數(shù)print(f.tell() # tell()方法顯示當(dāng)前文件指針?biāo)诘奈淖謋.close()seek(offset,whence) 方法用來重新設(shè)定指針的位置。offset:表示偏移量whence:只能傳入012中的一個數(shù)字。0表示從文件頭開始1表示從當(dāng)前位置開

9、始2 表示從文件的末尾開始f = open(test.txt,rb) # 需要指定打開模式為rb,只讀二進(jìn)制模式print(f.read(3)print(f.tell()f.seek(2,0) # 從文件的開頭開始,跳過兩個字節(jié)print(f.read()f.seek(1,1) # 從當(dāng)前位置開始,跳過一個字節(jié)print(f.read()f.seek(-4,2) # 從文件末尾開始,往前跳過四個字節(jié)print(f.read()f.close()CSV文件CSV文件:Comma-Separated Values,中文叫逗號分隔值或者字符分割值,其文件以純文本的形式存儲表格數(shù)據(jù)??梢园阉斫鉃橐粋€

10、表格,只不過這個表格是以純文本的形式顯示的,單元格與單元格之間,默認(rèn)使用逗號進(jìn)行分隔;每行數(shù)據(jù)之間,使用換行進(jìn)行分隔。name,age,scorezhangsan,18,98lisi,20,99wangwu,17,90jerry,19,95Python中的csv模塊,提供了相應(yīng)的函數(shù),可以讓我們很方便的讀寫csv文件。CSV文件的寫入import csv# 以寫入方式打開一個csv文件file = open(test.csv,w)# 調(diào)用writer方法,傳入csv文件對象,得到的結(jié)果是一個CSVWriter對象writer = csv.writer(file)# 調(diào)用CSVWriter對象的

11、writerow方法,一行行的寫入數(shù)據(jù)writer.writerow(name, age, score)# 還可以調(diào)用writerows方法,一次性寫入多行數(shù)據(jù)writer.writerows(zhangsan, 18, 98,lisi, 20, 99, wangwu, 17, 90, jerry, 19, 95)file.close()CSV文件的讀取import csv# 以讀取方式打開一個csv文件file = open(test.csv, r)# 調(diào)用csv模塊的reader方法,得到的結(jié)果是一個可迭代對象reader = csv.reader(file)# 對結(jié)果進(jìn)行遍歷,獲取到結(jié)果

12、里的每一行數(shù)據(jù)for row in reader: print(row)file.close()內(nèi)存中寫入數(shù)據(jù)除了將數(shù)據(jù)寫入到一個文件以外,我們還可以使用代碼,將數(shù)據(jù)暫時寫入到內(nèi)存里,可以理解為數(shù)據(jù)緩沖區(qū)。Python中提供了StringIO和BytesIO這兩個類將字符串?dāng)?shù)據(jù)和二進(jìn)制數(shù)據(jù)寫入到內(nèi)存里。StringIOStringIO可以將字符串寫入到內(nèi)存中,像操作文件一下操作字符串。from io import StringIO# 創(chuàng)建一個StringIO對象f = StringIO()# 可以像操作文件一下,將字符串寫入到內(nèi)存中f.write(hellorn)f.write(good)#

13、使用文件的 readline和readlines方法,無法讀取到數(shù)據(jù)# print(f.readline()# print(f.readlines()# 需要調(diào)用getvalue()方法才能獲取到寫入到內(nèi)存中的數(shù)據(jù)print(f.getvalue()f.close()BytesIO如果想要以二進(jìn)制的形式寫入數(shù)據(jù),可以使用BytesIO類,它的用法和StringIO相似,只不過在調(diào)用write方法寫入時,需要傳入二進(jìn)制數(shù)據(jù)。from io import BytesIOf = BytesIO()f.write(你好rn.encode(utf-8)f.write(中國.encode(utf-8)pr

14、int(f.getvalue()f.close()應(yīng)用:制作文件的備份輸入文件的名字,然后程序自動完成對文件進(jìn)行備份參考代碼# 提示輸入文件file_name = input(請輸入要拷貝的文件名字:)# 以讀的方式打開文件old_file = open(file_name, rb)# 分割文件名和后綴名file_names =file_name.rsplit(., maxsplit=1)# 組織新的文件名字new_file_name = file_names0 + .bak.+file_names1# 創(chuàng)建新文件newFile = open(new_file_name, wb)# 把舊文件中

15、的數(shù)據(jù),一行一行的進(jìn)行復(fù)制到新文件中for lineContent in old_file.readlines(): newFile.write(lineContent)# 關(guān)閉文件old_file.close()newFile.close()序列化和反序列化通過文件操作,我們可以將字符串寫入到一個本地文件。但是,如果是一個對象(例如列表、字典、元組等),就無法直接寫入到一個文件里,需要對這個對象進(jìn)行序列化,然后才能寫入到文件里。設(shè)計一套協(xié)議,按照某種規(guī)則,把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換為字節(jié)序列,保存到文件,這就是序列化,反之,從文件的字節(jié)序列恢復(fù)到內(nèi)存中,就是反序列化。Python中提供了JSON和p

16、ickle兩個模塊用來實現(xiàn)數(shù)據(jù)的序列化和反序列化。JSON模塊JSON(JavaScriptObjectNotation, JS對象簡譜)是一種輕量級的數(shù)據(jù)交換格式,它基于 ECMAScript 的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。JSON的本質(zhì)是字符串!使用JSON實現(xiàn)序列化JSON提供了dump和dumps方法,將一個對象進(jìn)行序列化。dumps方法的作用是把對象轉(zhuǎn)換成為字符串,它本身不具備將數(shù)據(jù)寫入到文件的功能。import jsonfile = open(names.txt, w)names = zhangsan, lisi, wangwu, jerry, he

17、nry, merry, chris# file.write(names) 出錯,不能直接將列表寫入到文件里# 可以調(diào)用 json的dumps方法,傳入一個對象參數(shù)result = json.dumps(names)# dumps 方法得到的結(jié)果是一個字符串print(type(result) # # 可以將字符串寫入到文件里file.write(result)file.close()dump方法可以在將對象轉(zhuǎn)換成為字符串的同時,指定一個文件對象,把轉(zhuǎn)換后的字符串寫入到這個文件里import jsonfile = open(names.txt, w)names = zhangsan, lisi,

18、 wangwu, jerry, henry, merry, chris# dump方法可以接收一個文件參數(shù),在將對象轉(zhuǎn)換成為字符串的同時寫入到文件里json.dump(names, file)file.close()注意:如果是一個空對象,調(diào)用dumps方法轉(zhuǎn)換成為一個JSON對象,得到的結(jié)果是null(JS里的空對象)json.dumps(None) # null使用JSON實現(xiàn)反序列化使用loads和load方法,可以將一個JSON字符串反序列化成為一個Python對象。loads方法需要一個字符串參數(shù),用來將一個字符串加載成為Python對象。import json# 調(diào)用loads方法

19、,傳入一個字符串,可以將這個字符串加載成為Python對象result = json.loads(zhangsan, lisi, wangwu, jerry, henry, merry, chris)print(type(result) # load方法可以傳入一個文件對象,用來將一個文件對象里的數(shù)據(jù)加載成為Python對象。import json# 以可讀方式打開一個文件file = open(names.txt, r)# 調(diào)用load方法,將文件里的內(nèi)容加載成為一個Python對象result = json.load(file)print(result)file.close()pickle

20、模塊和json模塊類似,pickle模塊也有dump和dumps方法可以對數(shù)據(jù)進(jìn)行序列化,同時也有l(wèi)oad和loads方法進(jìn)行反序列化。區(qū)別在于,json模塊是將對象轉(zhuǎn)換成為字符串,而pickle模塊是將對象轉(zhuǎn)換成為二進(jìn)制。pickle模塊里方法的使用和json里方法的使用大致相同,需要注意的是,pickle是將對象轉(zhuǎn)換成為二進(jìn)制,所以,如果想要把內(nèi)容寫入到文件里,這個文件必須要以二進(jìn)制的形式打開。區(qū)別(了解)思考: json和pickle兩個模塊都可以將對象進(jìn)行序列化和反序列化,那它們有哪些區(qū)別,在使用場景上又該如何選擇?json模塊:將對象轉(zhuǎn)換成為字符串,不管是在哪種操作系統(tǒng),哪種編程語言

21、里,字符串都是可識別的。json就是用來在不同平臺間傳遞數(shù)據(jù)的。并不是所有的對象都可以直接轉(zhuǎn)換成為一個字符串,下標(biāo)列出了Python對象與json字符串的對應(yīng)關(guān)系。PythonJSONdictobjectlist,tuplearraystrstringint,floatnumberTruetrueFalsefalseNonenull如果是一個自定義對象,默認(rèn)無法裝換成為json字符串,需要手動指定JSONEncoder.如果是將一個json串重新轉(zhuǎn)換成為對象,這個對象里的方法就無法使用了。import jsonclass MyEncode(json.JSONEncoder): def defa

22、ult(self, o): # return name:,age:o.age return o._dict_class Person(object): def _init_(self, name, age): = name self.age = age def eat(self): print(+正在吃東西)p1 = Person(zhangsan, 18)# 自定義對象想要轉(zhuǎn)換成為json字符串,需要給這個自定義對象指定JSONEncoderresult = json.dumps(p1, cls=MyEncode)print(result)

23、# name: zhangsan, age: 18# 調(diào)用loads方法將對象加載成為一個對象以后,得到的結(jié)果是一個字典p = json.loads(result)print(type(p)pickle模塊:pickle序列化是將對象按照一定的規(guī)則轉(zhuǎn)換成為二進(jìn)制保存,它不能跨平臺傳遞數(shù)據(jù)。pickle的序列化會將對象的所有數(shù)據(jù)都保存。異常的概念程序在運行過程中,由于我們的編碼不規(guī)范,或者其他原因一些客觀原因,導(dǎo)致我們的程序無法繼續(xù)運行,此時,程序就會出現(xiàn)異常。如果我們不對異常進(jìn)行處理,程序可能會由于異常直接中斷掉。為了保證程序的健壯性,我們在程序設(shè)計里提出了異常處理這個概念。讀取文件異常在讀取

24、一個文件時,如果這個文件不存在,則會報出FileNotFoundError錯誤。程序在運行過程中會經(jīng)常遇到類似的異常,如果我們不進(jìn)行處理,此時程序就會中斷并退出。為了提高程序的健壯性,我們可以使用異常處理機制來解決程序運行過程中可能出現(xiàn)的問題。try.except語句try.except語句可以對代碼運行過程中可能出現(xiàn)的異常進(jìn)行處理。 語法結(jié)構(gòu):try: 可能會出現(xiàn)異常的代碼塊except 異常的類型: 出現(xiàn)異常以后的處理語句示例:try: f = open(test.txt, r) print(f.read()except FileNotFoundError: print(文件沒有找到,請檢

25、查文件名稱是否正確)try.else語句咱們應(yīng)該對else并不陌生,在if中,它的作用是當(dāng)條件不滿足時執(zhí)行的實行;同樣在try.except.中也是如此,即如果沒有捕獲到異常,那么就執(zhí)行else中的事情try: num = 100 print(num) except NameError as errorMsg: print(產(chǎn)生錯誤了:%s%errorMsg) else: print(沒有捕獲到異常,真高興) 運行結(jié)果如下:try.finally語句try.finally.語句用來表達(dá)這樣的情況:在程序中,如果一個段代碼必須要執(zhí)行,即無論異常是否產(chǎn)生都要執(zhí)行,那么此時就需要使用finally。

26、 比如文件關(guān)閉,釋放鎖,把數(shù)據(jù)庫連接返還給連接池等。try: f = open(test.txt) try: while True: content = f.readline() if len(content) = 0: break print(content) except: #如果在讀取文件的過程中,產(chǎn)生了異常,那么就會捕獲到 #比如 按下了 ctrl+c pass finally: f.close() print(關(guān)閉文件)except: print(沒有這個文件)說明:我們可以觀察到KeyboardInterrupt異常被觸發(fā),程序退出。但是在程序退出之前,finally從句仍然被執(zhí)行

27、,把文件關(guān)閉。with關(guān)鍵字的使用對于系統(tǒng)資源如文件、數(shù)據(jù)庫連接、socket 而言,應(yīng)用程序打開這些資源并執(zhí)行完業(yè)務(wù)邏輯之后,必須做的一件事就是要關(guān)閉(斷開)該資源。比如 Python 程序打開一個文件,往文件中寫內(nèi)容,寫完之后,就要關(guān)閉該文件,否則會出現(xiàn)什么情況呢?極端情況下會出現(xiàn) Too many open files 的錯誤,因為系統(tǒng)允許你打開的最大文件數(shù)量是有限的。同樣,對于數(shù)據(jù)庫,如果連接數(shù)過多而沒有及時關(guān)閉的話,就可能會出現(xiàn) Can not connect to MySQL server Too many connections,因為數(shù)據(jù)庫連接是一種非常昂貴的資源,不可能無限制的

28、被創(chuàng)建。來看看如何正確關(guān)閉一個文件。普通版:def m1(): f = open(output.txt, w) f.write(python之禪) f.close()這樣寫有一個潛在的問題,如果在調(diào)用 write 的過程中,出現(xiàn)了異常進(jìn)而導(dǎo)致后續(xù)代碼無法繼續(xù)執(zhí)行,close 方法無法被正常調(diào)用,因此資源就會一直被該程序占用者釋放。那么該如何改進(jìn)代碼呢?進(jìn)階版:def m2(): f = open(output.txt, w) try: f.write(python之禪) except IOError: print(oops error) finally: f.close()改良版本的程序是對可

29、能發(fā)生異常的代碼處進(jìn)行 try 捕獲,使用 try/finally 語句,該語句表示如果在 try 代碼塊中程序出現(xiàn)了異常,后續(xù)代碼就不再執(zhí)行,而直接跳轉(zhuǎn)到 except 代碼塊。而無論如何,finally 塊的代碼最終都會被執(zhí)行。因此,只要把 close 放在 finally 代碼中,文件就一定會關(guān)閉。高級版:def m3(): with open(output.txt, r) as f: f.write(Python之禪)一種更加簡潔、優(yōu)雅的方式就是用 with 關(guān)鍵字。open 方法的返回值賦值給變量 f,當(dāng)離開 with 代碼塊的時候,系統(tǒng)會自動調(diào)用 f.close() 方法, with 的作用和使用 try/finally 語句是一樣的。上下文管理器w

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論