python文件操作及seek偏移詳解
- 2020 年 1 月 9 日
- 筆記
一、python文件操作中的編碼
本次測試是基於python 2.7.12 OS:Ubuntu16.04 pycharm環境,以及win7下2.7.12;
首先說下漢字在文件中佔用的位元組數,這個先看以下實驗(win7)下 因為linux下不支援gbk,本文不講utf-8 ,gbk編碼具體知識,有興趣可以訪問http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html或自行搜索相當資料。本次實驗只講解python在使用utf-8和gbk編碼時,對漢字佔用的位元組有所不同。
先看下實驗截圖:

右上解的程式碼如下:
#-*- coding: utf-8 -*- with open("test2.txt","w") as f: f.write("董hellow world!") f.write("Python is a good language!n") f.write("Python 是世界上最好的語言!") with open("test2.txt","r") as f: print(len(f.read())) f.seek(0) print f.read(2) f.seek(0) print f.read(3) f.tell()
保存運行(F5) 運行結果為圖左上角 出現長度78 和漢字"董"的亂碼 再次從頭讀3個位元組 可以正確顯示「董」
右下解的程式碼如下:
#-*- coding: gbk -*- with open("test3.txt","w") as f: f.write("董hellow world!") f.write("Python is a good language!n") f.write("Python 是世界上最好的語言!") with open("test3.txt","r") as f: print(len(f.read())) f.seek(0) print f.read(2) f.tell()
保存運行(F5)運行結果為圖左下角 出現長度為68 能正確顯示「董」
test2.txt 和test3.txt中的內容均一樣,只是在不同的編碼下存入文件中!
從實驗可以看出漢字在utf8編碼下佔3個位元組,gbk下佔2個位元組,而英文不管在那個編碼下都只佔1個位元組!
二、python文件操作
搞清楚以上問題我們可以通過操作文件來讀取內容,以防止是亂碼。
1、python文件操作主要通過file(3版本去掉了), open(2,3版本均有)函數來實現
open函數中最主要的幾個模式說明及對比:
|
模式 |
打開方式 |
文件存在 |
文件不存在 |
|---|---|---|---|
|
r |
只讀 |
打開文件 |
出錯 |
|
w |
只寫 |
清除原有文件內容 |
創建並打開新文件 |
|
a |
只寫(追加) |
保留文件內容,將新數據添加到文件末尾 |
創建並打開新文件 |
|
r+ |
讀寫 |
從文件開始處讀或重寫文件內容 |
出錯 |
|
w+ |
讀寫 |
清除文件內容 |
創建並打開新文件 |
|
a+ |
讀寫 |
保留文件內容,將新數據添加到文件末尾 |
創建並打開新文件 |
註:如是是對二進位文件操作即在以上模式中加一個b 如讀二制文件rb
2、文件操作方法實驗
f.write() #字元串寫入文件
f.writelines #將一串字元串寫入文件。 該序列可以是生成字元串的任何可迭代對象,通常是字元串列表
f.read([size]) #默認讀出文件中所有內容,可以指定size(位元組)
f.readline([size]) #默認每次讀取一行,字元串中保留一個尾隨的換行字元。
f.readlines([size]) #默認將文件內容講到列表中保存
f.flush() #將緩衝中的內容寫入磁碟
f.tell() #顯示當前文件的指針所在位置
f.close() #關閉打開的文件
f.seek() #對文件進行指針偏移操作,有三個模式,
seek(0,0) 默認移動到文件開頭或簡寫成seek(0)
seek(x,1) 表示從當前指針位置向後移x(正數)個位元組,如果x是負數,則是當前位置向前移動x個位元組
seek(x,2) 表示從文件末尾向前後移x(正數)個位元組,如果x負數,則是從末尾向前移動x個位元組
3、對文件seek詳細說明
實驗程式碼如下:
先創建一個文件file2.txt
# -*- coding: utf-8 -*- f = open("file2.txt",'w+') f.write("I love pythonn") f.write("python 是世界上最美麗的語言!n") f.write("python 世界上最美麗的語言?")
file2.txt內容如下:
I love python python 是世界上最美麗的語言! Python 世界上最美麗的語言
對file2.txt進行操作
f = open("file2.txt",'r') print(len(f.read())) #文件總長度 89 print(f.tell()) #讀完文件,文件指針位置89 f.seek(0,0) #偏移迴文件頭 print(f.readline()) #列印出文件中一行(第一行) print f.tell() #顯示文件指針現在的位置 f.seek(2,1) #從當前文件指針(向後)偏移2個位元組 print(f.readline()) #再列印一行(應該少2個位元組) print(f.tell()) #顯示 現在 的指針位置 f.seek(-7,1) #從當前位置向前偏移2個位元組 print(f.readline()) #列印下一行 print(f.tell()) #顯示 現在 的指針位置 f.seek(-9,2) #從尾部向前偏移9個字元 print(f.tell()) #顯示 現在 的指針位置 print(f.readline()) #列印出內容 f.seek(0) #==>默認是0 等等seek(0,0) f.seek(80) #等同上面的seek(-9,2) 從尾部取 print(f.readline())
結果如圖:

本文均為在學習過程中的實驗結果,可能不同版本不同平台略有誤差,如有不當之處,歡迎指正交流!

