1. 程式人生 > >2 文件操作

2 文件操作

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(rC:\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(rC:\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(rC:\Users\dddd\Desktop\‘)
11      
12 SyntaxError: EOL while scanning string literal
13 >>> os.chdir(rC:\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 文件操作