Python之文件操作:文件的讀寫


一、open函數:對文件讀寫之前,需要先打開文件,獲取文件句柄
注意:open() file() 盡量使用open(),Python3以后不支持file()了
1、open(file_name[,access_mode][,buffering])
(1)參數說明
file_name:一個包含了你要訪問的文件路徑及文件名稱的字符串值。盡量使用絕對路徑
access_mode:打開文件的方式:這個參數是非強制的,默認文件訪問模式為只讀(r)
r,只讀
w:寫之前會清空文件的內容
a:追加的方式,在原本內容中繼續寫
buffering:先寫到緩存中
如果buffering的值被設置為0,就不會有寄存;如果值為1,訪問文件時會緩存行;如果值位大於1的整數,表明了這就是寄存區的緩沖大小;如果取負值,寄存區的緩沖大小則為系統默認。該參數也是非強制性的。
(2)返回值
該語句表示返回的File_object是一個指向文件的指針(一個文件對象)文件句柄。當以只讀模式(r)打開一個不存在的文件時,就會報IOError異常(文件不存在),但如果是以寫或追加模式(w/a/a+)打開一個不存在的文件時,默認會創建該文件,但如果是所在路徑中有目錄不存在,也會報IOError異常
 
創建一個文件:
fp=open('d:\\tmp\\01.txt',w)
 
2、mode文件操作模式
r,w,a
r+可讀可寫
w+:打開一個文件用於讀寫。如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。
a+:打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。
 
rb wb ab 讀寫二進制
 
3、通過open獲取到的文件句柄可以對文件作的其他操作
(1)fp.closed
判斷文件是否已經關閉。返回true如果文件已被關閉,否則返回false
(2)fp.mode
輸出讀寫模式。返回被打開文件的訪問模式。
(3)fp.name:
返回文件的名稱。
(4) fp.softspace
如果用print輸出后,是否跟一個空格符,false不打印,true則打印。
(5)fp.close()
刷新緩沖區里任何還沒寫入的信息,並關閉該文件,這之后便不能再進行寫入。
(6)flush()
把緩沖區中的內容持久化寫到磁盤里
緩存區寫滿的情況,系統會自動調用flush()方法。
調用flush的時機:寫入了多少長度的數據,或者間隔了多長的時間
如果沒有flush(),持久化內容丟失
(7)next()
# for i in fp:
# print i
把一個file用for...in file這樣的循環遍歷語句時,就是調用next()函數來實現。
文件句柄是一個迭代器???
 
fp=open(fileName,'r')
 
print fp.next()
print fp.next()
print fp.fileno() 判斷當前操作的文件句柄是哪一個number
fp.close()
 
(8)裁剪文件truncate([size])
用於截斷文件,如果指定了可選參數 size,則表示截斷文件為 size 個字符。 如果沒有指定 size,則從當前位置起截斷;截斷之后 size 后面的所有字符被刪除。
如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。
fp='e:\\tmp\\03.txt'
 
f1=open(fp,'r+')
line=f1.readline()
print line
 
f1.truncate()
print f1.tell()
f1.close()
 
二、對文件作讀寫操作
1、常規的讀寫操作
(1)read([size])
size:讀取的長度,以byte為單位。如果不指定參數,表示一次性讀取全部內容,以字符串形式返回,並且每一行結尾會有一個"\n"符號。
 
(2)、readline([size])
調一次讀取一行,如果給定了size,有可能返回的只是一行的一部分,以字符串的形式返回,並且結尾會有一個換行符"\n"。讀完一行,文件操作標記移動到下一行的開頭。
返回的是字符串
 
(3)、readlines([size])
(3.1)參數
size:指定很小的數字,會不生效,python 默認8k緩存區大小,需要大於8k生效
讀取文件的全部內容,這個函數的內部是通過循環調用readline()來實現的
(3.2)返回值
返回的是列表格式,每一行是列表的一個元素,並且結尾會有一個換行符"\n"
 
(4)、writelines(seq)
seq:把seq(序列)的內容全部寫到文件中(多行一次性寫入)。也不會自動加入換行符。
注意:序列中的內容也必須是字符串類型的數據,才能成功寫入文件。
 
(5)、write(str)
把str寫到文件中,默認是不加換行符的,所以如果想換行的話,得手動加入換行符'\n'。
 
2、使用linecache模塊讀取文件
import linecache
允許從任何文件里得到任何的行,並且使用緩存進行優化,常見的情況是從單個文件讀取多行。
(1)linecache.getlines(filename,lineno)
從名為 filename 的文件中得到第 lineno 行。
這個函數從不會拋出一個異常–產生錯誤時它將返回”(換行符將包含在找到的行里)。
如果文件沒有找到,這個函數將會在 sys.path 搜索。
(2)linecache.getlines(filename) 返回列表
從名為 filename 的文件中得到全部內容,輸出為列表格式,以文件每行為列表中的一個元素,並以 linenum-1 為元素在列表中的位置存儲
(3)linecache.clearcache()
清除緩存,如果你不再需要先前從 getline() 中得到的行
(4)linecache.checkcache([filename])
檢查緩存的有效性。如果在緩存中的文件在硬盤上發生了變化,並且你需要更新版本,使用這個函數。
如果省略 filename,將檢查緩存里的所有條目。
(5)linecache.updatecache(filename)
更新文件名為 filename 的緩存。如果 filename 文件更新了,使用這個函數可以更新
linecache.getlines(filename)返回的列表。
 
另:讀取文件之后你不需要使用文件的緩存時需要在最后清理一下緩存,使linecache.clearcache()清理緩存,釋放緩存。
這個模塊是使用內存來緩存你的文件內容,所以需要耗費內存,打開文件的大小和打開速度和你的內存大小有關系。
打印奇數行的文件:
fp='e:\\tmp\\05.txt'
list1=linecache.getlines(fp)
for i in list1[::2]:
print i
 
3、pickle模塊和cPickle模塊
對文件整體的讀寫
(1)、pickle模塊(Python提供一個標准的模塊)
列表內容持久存儲到內存中
使用它你可以在一個文件中儲存任何Python對象,之后你又可以把它完整無缺地取出來。這被稱為持
久地儲存對象(序列化)
(2)、cPickle 列表和文件內容的轉換
它的功能和pickle模塊完全相同,只不過它是用C語言編寫的,因此要快得多(比pickle快1000倍),推薦使用。
import cPickle as p
p.dump(list,fp) 把列表list內容保存到內存中,存入一個文件(這個文件帶有cPickle特有的格式)中
fp:打開的文件句柄,如:fp=open('d:\\tmp\\test1.txt','wb')
list=p.load(fp) 把之前存放在文件中的內容保存到列表list中
 
 
三、讀取文件的位置定位
1、tell()
返回當前操作文件讀取到的位置
一個中文:3個字節
Windows下‘\r\n’(換行符)占兩個字節,Linux下\n mac下\r.
2、seek(offset[,from]) 移動游標到想去的位置
from:,默認是0,2:從末尾開始計算偏移;1:從當前位置作為標准位置
offset:移動的總距離,可以是正數,可以為負數
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM