1. 程式人生 > >9、文件操作

9、文件操作

gbk seek 編碼 trunc int 必須 時也 tell 二進制

一.文件處理流程

  1. 打開文件,得到文件句柄並賦值給一個變量
  2. 通過句柄對文件進行操作
  3. 關閉文件
f=open(‘a.txt‘,‘w‘)
f.write(‘111111\n‘)
f.close()

二.基本操作

2.1 文件編碼

#不指定打開編碼,默認使用操作系統的編碼,windows為gbk,linux為utf-8,與解釋器編碼無關
f=open(‘chenli.txt‘,encoding=‘gbk‘) #在windows中默認使用的也是gbk編碼,此時不指定編碼也行
f.read()

  

2.2 文件打開模式

f=open(‘文件名‘,‘模式‘)
f=open(‘a.txt‘,‘r+‘) #讀寫
f=open(‘a.txt‘,‘w+‘) #寫讀
f=open(‘a.txt‘,‘a+‘) #追加並且讀
    。
    。
    。
    。
    。
    。

打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。

打開文件的模式有:

  • r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
  • w,只寫模式【不可讀;不存在則創建;存在則清空內容】
  • x, 只寫模式【不可讀;不存在則創建,存在則報錯】
  • a, 追加模式【可讀; 不存在則創建;存在則只追加內容】

"+" 表示可以同時讀寫某個文件

  • r+, 讀寫【可讀,可寫】
  • w+,寫讀【可讀,可寫】
  • x+ ,寫讀【可讀,可寫】
  • a+, 寫讀【可讀,可寫】

"b"表示以字節的方式操作

  • rb 或 r+b
  • wb 或 w+b
  • xb 或 w+b
  • ab 或 a+b

註:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼

常見的mode取值組合

r或rt 默認模式,文本模式讀
rb 二進制文件

w或wt 文本模式寫,打開前文件存儲被清空
wb 二進制寫,文件存儲同樣被清空

a 追加模式,只能寫在文件末尾
a+ 可讀寫模式,寫只能寫在文件末尾

w+ 可讀寫,與a+的區別是要清空文件內容
r+ 可讀寫,與a+的區別是可以寫到文件任何位置

2.3 上下文管理

1 #上下文管理
2 with open(a.txt,r,encoding=utf-8) as f,open(b.txt) as b_f:
3 # print(f.read()) 4 print(====>)

補充

 1 for i in range(3):
 2     print(i)
 3     # continue
 4     if i == 1:
 5         break
 6 else:
 7     print(=============>) #當for循環不被break打斷,就會執行else的代碼
 8 
 9 with open(a.txt,r,encoding=utf-8) as read_f,10         open(aa.txt,w,encoding=utf-8) as write_f:
11 
12     for line in read_f:
13         write_f.write(line)
14     else:
15         print(write successfull)

2.4 文件的操作方法

f.read 讀取文件所有內容

f.read 讀取文件所有內容

f.readline 讀取一行內容

f.readlines 讀取每行內容,返回一個列表

f.close() 關閉文件

f.seek() 移動指針到指定位置

f.tell() 獲取當前指針位置

f.flush() 把緩存寫入到硬盤

f.mode() 顯示文件打開格式

f.truncate() f.truncate(10)截取文件0-10字符,超出部分刪除

f.writelines() 傳入一個列表,並將列表每個元素寫入到文件

f.xreadlines() 已叠代方式循環文件,每循環一次,只讀一行。處理大文件效率高

 1 #不常用的,了解
 2 
 3 with open(a.txt,r,encoding=utf-8) as f:
 4     print(f.read(4)) #數字指的是讀的是字符
 5 
 6 with open(a.txt,rb) as f:
 7     print(f.read(1)) #數字指的是讀的是字符
 8 
 9 
10 with open(a.txt,r,encoding=utf-8) as f:
11     f.seek(3) #seek內指定的數字代表字節
12     print(f.tell()) #當前光標所在的位置
13     print(f.read())
14 
15 with open(aa.txt,r+,encoding=utf-8) as f:
16     # f.seek(3) #seek內指定的數字代表字節
17     # print(f.read())
18 
19     f.truncate(1)
20 
21 
22 with open(b.txt,rb) as f:
23     f.read()
24     f.seek(3) #默認情況,是以文件起始位置作為開始,往後移動3個bytes
25     f.read(1)
26     print(f.tell())
27     f.seek(2,1) #1 代表以當前光標所在的位置為開始,往後移動2個 bytes
28     print(f.tell())
29 
30     f.seek(-1,2) #2表以當前光標所在的位置為開始,往後移動2個 bytes
31     print(f.tell())
32 
33     f.seek(0,2)
34 
35 with open(c.txt,r,encoding=utf-8) as f:
36     f.seek(0,2)
37     print(====>,f.read())

2.5 文件的修改

 1 import os
 2 with open(a.txt,r,encoding=utf-8) as read_f, 3         open(.a.txt.swap,w,encoding=utf-8) as write_f:
 4     for line in read_f:
 5         if line.startswith(hello):
 6             line=哈哈哈\n
 7         write_f.write(line)
 8 
 9 os.remove(a.txt)
10 os.rename(.a.txt.swap,a.txt)

9、文件操作