1. 程式人生 > >Python學習—基礎篇之文件操作

Python學習—基礎篇之文件操作

flush 一次 格式化 mod 當前 ani author 對象 run

文件操作

文件操作也是編程中需要熟練掌握的技能,尤其是在後臺接口編寫和數據分析過程中,對各種類型的文件進行操作,獲取文件信息或者對信息進行存儲是十分重要的。本篇博客中將主要對常見的文本格式文件和Excel文件的相關操作進行介紹。

一、文本文件

1.1 文件操作流程

  1、打開文件,獲得文件句柄,並賦值給一個變量 ;

  2、通過句柄對文件進行相關操作;

  3、關閉文件

示例:

 1 # -*- coding:utf-8 -*-
 2 # author: cdc
 3 # date: 2018/8/23
 4 
 5 f = open(動物世界.txt,r,encoding=utf-8
) 6 content = f.read() 7 print(content) 8 f.close() 9 10 #***************運行結果***************** 11 ‘‘‘ 12 東打一下西戳一下 13 動物未必需要尖牙 14 示愛的方法有禮貌或是我管它 15 要將情人一口吞下 16 還要顯得溫文爾雅 17 螳螂委屈的展示舊傷疤 18 ...... 19 ‘‘‘

open函數中,第一個參數為文件存儲的位置+文件名(我在本地測試時文件與代碼同級),第二個參數為文件的操作模式,第三個參數為操作的編碼方式。

註意:文件是utf8保存的,打開文件時open函數是通過操作系統打開的文件,而win操作系統默認的是gbk編碼,所以直接打開會亂碼,需要encoding=‘utf8‘。

文件如果是gbk保存的,則直接打開即可。

1.2 文件的操作模式

========= ===============================================================
    Character Meaning
    --------- ---------------------------------------------------------------
    r       open for reading (default)
    w       open for writing, truncating the file first
    
x create a new file and open it for writing a open for writing, appending to the end of the file if it exists b binary mode t text mode (default) + open a disk file for updating (reading and writing) U universal newline mode (deprecated) ========= ===============================================================

示例:

 1 # -*- coding:utf-8 -*-
 2 # author: cdc
 3 # date: 2019/1/21
 4 
 5 # 只讀文件
 6 f = open(a.txt,r,encoding=utf-8)
 7 f.read()
 8 f.close()
 9 
10 # 只寫文件
11 # 註意: 1.若無該文件,寫文件操作時會自動創建;2.再次寫入時會從開頭寫,將原來的內容覆蓋
12 f = open(a.txt,w,encoding=utf-8)
13 f.write(helloll)
14 f.close()
15 
16 # 以追加模式寫入,會接著上一次的地方繼續寫
17 f = open(a.txt,a,encoding=utf-8)
18 f.write(123456879)
19 f.close()
20 
21 # 以讀寫的模式操作文件
22 f = open(a.txt,r+,encoding=utf-8)
23 f.read(5)
24 f.write(233333)
25 f.read()
26 f.close()
27 
28 # 以寫讀的模式操作文件
29 f = open(a.txt,w+)
30 print(f.read(5))         # 什麽都沒有,因為先格式化了文本
31 f.write(hello cdc)
32 print(f.read())          #還是read不到
33 f.seek(0)
34 print(f.read())
35 
36 # 以二進制方式讀文件
37 f = open(a.txt,rb)
38 content = f.read()
39 print(type(content))
40 f.close()
41 
42 # 以二進制方式寫文件
43 f = open(a.txt,wb)
44 f.write(hello alvin!.encode())
45 f.close()

1.3 文件操作的具體方法

文件內容的讀取:

1 f.read()               # 將文件內容全部讀出來
2 f.read(5)              # 讀取五個字節的內容
3 f.readline()           # 讀取一行
4 f.readlines()          # 將所有內容以換行符為準分割,形成一個列表對象

查看光標位置及光標操作:

1 #查看光標當前位置
2 f = open("a.txt","r",encoding="utf8")
3 print(f.tell())
4 print(f.read(5))
5 #一個中文默認為是三個字符
6 print(f.tell())
7 f.seek(0) #調整光標位置
8 print(f.read(5))
 1 f = open(a.txt, rb, )  
 2 f.read(3)
 3 f.seek(3)
 4 print(f.read(3))
 5 
 6 f.seek(3,1)          # 1為從當前位置,移動3個字節
 7 print(f.read(3))
 8 
 9 f.seek(-4,2)        # 2為從從文件末尾算,向前移動4個字節
10 print(f.read(3))
11 f.close()

flush操作:將緩沖區的內容刷新到終端

1 import sys,time
2 for i in range(30):
3     sys.stdout.write("*") #在緩沖區內寫內容
4     sys.stdout.flush() #將緩沖區內容刷新到終端顯示
5     print("*",end=‘‘,flush=True)
6     time.sleep(0.2)
7 f = open("小重山","w",encoding="utf8")
8 f.truncate()  #截斷操作,只保留光標前的內容,不設置參數時默認光標位置為0

1.4 with方法

為了避免打開文件後忘記關閉,可以通過管理上下文,即:

1 with open(a.txt,r,encoding=utf-8) as f:
2     f.readline()

如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。with支持同時對多個文件的上下文進行管理,即:

1 with open(a.txt,r,encoding=utf-8) as f_read, open(b.txt,w,encoding=utf-8) as f_write:
2     f_read.readline()
3     f_write.write(hello)

1.5 踩坑啦!!!

對於文件的讀取操作,本人在公司遇到過不少的麻煩。。。由於每個人使用的文本編輯器不同,並且不是所有人都能關註到語言格式的問題,所以往往存儲的文件編碼格式五花八門,等到這些數據到我手裏需要處理的時候。。。我的內心 (▼ヘ▼#) (╯°Д°)╯︵┻━┻

起初我打算自己寫一套腳本來識別各種語言格式並統一轉化成utf-8格式,無奈編碼格式實在是太多種了,很難判斷完全。後來我發現有一個非常巧妙的方法:

1 with open(filename,r,encoding=iso-8859-1) as f:
2     for line in f.readlines():
3         content = bytes.decode(line.encode(utf-8))
4         print(type(content))

以‘iso-8859-1‘的編碼方式去讀取文件,無論哪種編碼格式的文件都可以以bytes類型的形式被讀取出來,接著只要再將bytes轉換成str,並以‘utf-8‘格式編碼就大功告成了!

還有一種情況,在已經知道文件是以‘utf-8‘編碼格式存儲的情況下,以‘utf-8‘方式去讀取還是報錯:

1 with open(a.txt,r,encoding=utf-8) as f:
2     for i in f.readlines():
3         print(i)
4         
5 # 結果報錯
6 #‘\ufeffHello,World\n‘

a.txt的文件編碼格式為utf-8,但是讀取的第一行前面會出現非法字符‘\ufeff‘,後來發現是utf-8編碼有無BOM的原因造成的。BOM,即Byte Order Mark,就是字節序標記,具體原理感興趣的童鞋可以谷歌了解一下!遇到這種情況只需要在讀取文件的時候如下操作即可:

1 with open(a.txt, r, encoding=utf-8-sig) as f:
2     for i in f.readlines():
3         print(i)

Python學習—基礎篇之文件操作