2 文件操作
阿新 • • 發佈:2018-01-14
literal ddd exti lin tony 返回 很多 unicode 檢查
在Python世界中,文件也是一種數據類型。文件這個變量指向的是本地的文件
文件的聲明由全局函數open(file_name [, access_mode][, buffering])完成,該函數有三個參數:
file_name:文件路徑+文件名
access_mode:操作模式
buffering:編碼方式
文件路徑: 絕對路徑的方式: ‘c:\\path\\data.txt‘ 或 r‘c:\path\data.txt‘ 相對路徑的方式: ‘data.txt‘ 系統會在當前的系統環境變量中的路徑下去找,所以要用相對路徑的方式,就得確保文件是放在這個路徑下的,不然就找不到了 一般情況下還是用絕對路徑吧。更清晰,不容易出錯。 操作模式: 針對兩大類文件:文本文件(unicode字符串),二進制文件(字節) 文本文件: ‘r‘ : 表示以只讀的方式操作當前的文件 ‘w‘ : 表示以寫入的方式操作當前的文件 ‘rw‘ : 表示以讀和寫的方式操作當前的文件,會覆蓋之前的內容 ‘a‘ : 打開文本,在文本中追加一些內容。 二進制: ‘rb‘ : 表示以讀的方式操作當前的文件 ‘wb‘ : 表示以寫入的方式操作當前的文件 ‘rwb‘ : 表示以讀和寫的方式操作當前的文件 ‘ab‘ : 打開文本,在文本中追加一些內容 基本文件讀寫操作1>>> #先在桌面創建一個文件my_python.txt文件,編輯內容:我愛python 2 >>> #C:\Users\dddd\Desktop\mypython.txt 3 >>> #創建該文件的文件對象 4 >>> f = open(r‘C:\Users\dddd\Desktop\mypython.txt‘,‘r‘,encoding=‘UTF-8‘) 5 6 >>> #看看文件對象的類型 7 >>> type(f) 8 <class ‘_io.TextIOWrapper‘> 9 10 >>> # 一次性讀出文件中的所有內容 11 >>> f.read() 12 ‘\ufeff我愛python‘ 13 >>> 14 >>> type(f.read()) 15 <class ‘str‘> 16 >>> # 可見f.read()讀取的文件內容是轉化成字符串的 17 >>> 18 >>> f.read() 19 ‘‘ 20 >>> #什麽情況,為什麽再次來讀文件內容返回空字符串? 21 >>> #文件內部有一個指針,read()從頭開始讀,一直讀到最後結束,指針就在文件末尾的位置。所以再調用read()方法,發現已經沒有什麽可讀了。 22 >>> #有兩種方法可以重新讀取出文件內容 23 >>> #方法 1 再創建一個該文件的文件對象,用新的文件對象讀取文件中的內容 24 25 >>> #方法 2 把指針重新移到文件的開頭,調用seek(),將指針移到第一個字符的位置 26 >>> #把指針移動到文件開頭 27 >>> f.seek(0) 28 0 29 >>> #seek()會返回移動指針後指針的位置 30 >>> f.read() 31 ‘\ufeff我愛python‘ 32 >>> #看到了吧,把文件的指針移動到文件開頭,又可以讀取文件內容了 33 >>> 34 >>> #強烈建議大家,文件對象用完之後,明確地關閉文件鏈接 35 >>> f.close()
深入學習文件讀操作
1 >>> f = open(r‘C:\Users\dddd\Desktop\mypython.txt‘,‘r‘,encoding=‘UTF-8‘) 2 >>> f.read() 3 ‘\ufeff我愛python\n全會由中央紀律檢查委員會常務委員會主持。\n全會以新時代中國特色社會主義思想為指導,\n全面貫徹落實黨的十九大精神,\n研究部署2018年紀檢監察工作,\n審議通過了趙樂際同誌代表中央紀委常委會所作\n的《以新時代中國特色社會主義思想為指導\u3000堅定不移落實黨的十九大全面從嚴治黨戰略部署》工作報告。‘ 4 >>> #read()方法是直接把文件中的所有內容作為一個字符串返回的,當文件內容較少時無所謂,但是文件內容比較多,處理速度可能就會很慢 5 >>> 6 >>> # 另外一個讀取方法,readlines(),讀取文件所有的行,默認把整個文件以行為單位進行切割,返回切割後作為列表的元素返回列表 7 >>> f.seek(0) 8 0 9 >>> f.readlines() 10 [‘\ufeff我愛python\n‘, ‘全會由中央紀律檢查委員會常務委員會主持。\n‘, ‘全會以新時代中國特色社會主義思想為指導,\n‘, ‘全面貫徹落實黨的十九大精神,\n‘, ‘研究部署2018年紀檢監察工作,\n‘, ‘審議通過了趙樂際同誌代表中央紀委常委會所作\n‘, ‘的《以新時代中國特色社會主義思想為指導\u3000堅定不移落實黨的十九大全面從嚴治黨戰略部署》工作報告。‘] 11 >>> #可以把f.readlines()返回的列表指定一個列表名 12 >>> f.seek(0) 13 0 14 >>> l = f.readlines() 15 >>> #接下來對列表l進行操作就行了,跟沒文件對象什麽事了 16 >>> #readlines()還是存在一次性返回文件所有內容的情況,若文件較大,會影響運行速度 17 >>> 18 >>> #readline()函數是逐行讀取文件內容 ,非常適合讀取大文件,節省內存,調用一次就會讀取文件的一行並以字符串的形式返回 19 >>> 20 >>> f.seek(0) 21 0 22 >>> f.readline() 23 ‘\ufeff我愛python\n‘ 24 >>> f.readline() 25 ‘全會由中央紀律檢查委員會常務委員會主持。\n‘ 26 >>> 27 >>> #當然還是有很多應用場景需要把文件用readlines()按行拆分列表,然後會列表中的每個元素進行處理 28 29 >>> 30 >>> #由於文件對象f是可叠代對象,可以直接遍歷獲取文件內容 31 >>> #這樣就不用把文件讀取到列表中,因為文件太大,比較消耗內存 32 >>> f.seek(0) 33 0 34 >>> for line in f: 35 print(line) 36 37 38 我愛python 39 40 全會由中央紀律檢查委員會常務委員會主持。 41 42新時代中國特色社會主義思想為指導, 43 44 全面貫徹落實黨的十九大精神, 45 46 研究部署2018年紀檢監察工作, 47 48 審議通過了趙樂際同誌代表中央紀委常委會所作 49 50 的《新時代中國特色社會主義思想為指導 堅定不移落實黨的十九大全面從嚴治黨戰略部署》工作報告。 51 >>>
深入學習文件寫操作
1 >>> import os 2 >>> #獲取當前工作目錄 3 >>> os.getcwd() 4 ‘C:\\Users\\dddd\\AppData\\Local\\Programs\\Python\\Python35‘ 5 >>> #如果我文件沒有放在這個目錄下,想要創建一個文件對象就必須用絕對路徑 6 >>> #有時候為了少寫一些路徑,可以直接把工作目錄切換到文件所在的路徑 7 >>> 8 >>> #將工作目錄切換到桌面 9 >>> #桌面的路徑:C:\Users\dddd\Desktop\ 10 >>> os.chdir(r‘C:\Users\dddd\Desktop\‘) 11 12 SyntaxError: EOL while scanning string literal 13 >>> os.chdir(r‘C:\Users\dddd\Desktop‘) 14 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 15 >>> 16 >>> # 寫入方法 1 write() 一次只寫入一行,w模式會覆蓋之前文件中的內容 17 >>> f.write(‘I love python‘) 18 13 19 >>> #write()函數會返回本次向文件中寫入了多少個字節 20 >>> 21 >>> f.close() 22 >>> #關閉文件鏈接,將緩存中的內容寫入到硬盤上 23 >>> 24 >>> #寫入方法 2 write() 一次性寫入多行,實現準備一個list,每一行要寫入文件的內容作為list的一個元素 25 >>> l = [‘Mark‘,‘Tony‘,‘Marry‘,‘Mike‘,‘Jack‘] 26 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 27 >>> f.writelines(l) 28 >>> #到這裏,寫入操作已經完成,但實際上只是寫入到緩存,除了關閉鏈接將緩存中的內容刷新到硬盤中,還可以用flush()函數,在不關閉文件鏈接的情況下將緩存中的內容刷新到硬盤中 29 >>> f.flush() 30 >>> f.close() 31 >>> 32 >>> #折騰了半天,看看現在文件中的內容是什麽 33 >>> f = open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) 34 >>> f.read() 35 ‘MarkTonyMarryMikeJack‘ 36 >>> #咦???我實現多行顯示這幾個名字的,怎麽都顯示在一行上了? 37 >>> f.close() 38 >>> 39 >>> #看來是用writelines()函數時,需要手工為沒一行內容後加上換行符 \n 40 >>> 41 >>> l 42 [‘Mark‘, ‘Tony‘, ‘Marry‘, ‘Mike‘, ‘Jack‘] 43 >>> ll = [a + ‘\n‘ for a in l] 44 >>> f = open(‘mypython.txt‘,‘w‘,encoding=‘utf-8‘) 45 >>> l 46 [‘Mark‘, ‘Tony‘, ‘Marry‘, ‘Mike‘, ‘Jack‘] 47 >>> ll = [a + ‘\n‘ for a in l] 48 >>> f.writelines(ll) 49 >>> f.flush() 50 >>> f.close() 51 >>> 52 >>> #再看看文件的寫入效果 53 >>> f = open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) 54 >>> f.read() 55 ‘Mark\nTony\nMarry\nMike\nJack\n‘ 56 >>> 57 >>> 58 >>> # 寫入方法 3 如果想在原文件的基礎上追加一些內容,可用a模式 59 >>> f.close() 60 >>> f = open(‘mypython.txt‘,‘a‘,encoding=‘utf-8‘) 61 >>> f.writelines([‘John‘]) 62 >>> f.close() 63 >>>
上下文語法
1 >>> #為了避免忘寫close(),可以用上下文的語法,通過一個特定的代碼段,將一系列的操作封裝在上下文環境中,當環境結束時,會自動調用close()函數 2 >>> with open(‘mypython.txt‘,‘a‘,encoding=‘utf-8‘) as f: 3 f.write(‘I Love 廣東億迅‘) 4 5 6 11 7 >>> 8 >>> #再來看看文件中的內容情況 9 >>> with open(‘mypython.txt‘,‘r‘,encoding=‘utf-8‘) as f: 10 f.read() 11 12 13 ‘Mark\nTony\nMarry\nMike\nJack\nJohnI Love 廣東億迅‘ 14 >>> 15 #這個上下文的語法很實用,比如數據庫的操作連接,網絡連接等,自動釋放資源,很方便
2 文件操作