檔案處理的流程1. 開啟檔案,得到檔案控制代碼並賦值給乙個變數
f=open('
a.txt
','r
',encoding='
utf-8
') #
預設開啟模式就為r
2. 通過控制代碼對檔案進行操作
data=f.read()
3. 關閉檔案
f.close()
開啟乙個檔案包含兩部分資源:作業系統級開啟的檔案+應用程式的變數。在操作完畢乙個檔案時,必須把與該檔案的這兩部分資源乙個不落地**,**方法為:
1、f.close() #
**作業系統級開啟的檔案
2、del f #
**應用程式級的變數
其中del f一定要發生在f.close()之後,否則就會導致作業系統開啟的檔案還沒有關閉,白白占用資源,
而python自動的垃圾**機制決定了我們無需考慮del f,這就要求我們,在操作完畢檔案後,一定要記住f.close()
with open(
'a.txt
','w
') as f:
pass
with open(
'a.txt
','r
') as read_f,open('
b.txt
','w
') as write_f:
data=read_f.read()
write_f.write(data)
f=open(...)是由作業系統開啟檔案,那麼如果我們沒有為open指定編碼,那麼作業系統會用自己的預設編碼去開啟檔案,在windows下是gbk,在linux下是utf-8。
若要保證不亂碼,檔案以什麼方式存的,就要以什麼方式開啟。
f=open('
a.txt
','r
',encoding='
utf-8')
python2和python3的區別:
在python3中操作檔案只有一種選擇,那就是open()
在python2中則有兩種方式:file()與open()
兩者都能夠開啟檔案,對檔案進行操作,也具有相似的用法和引數,但是,這兩種檔案開啟方式有本質的區別,
file為檔案類,用file()來開啟檔案,相當於這是在構造檔案類,
而用open()開啟檔案,是用python的內建函式來操作,
我們一般使用open()開啟檔案進行操作,而用file當做乙個型別,比如type(f)
isfile
開啟檔案的模式
r,唯讀模式【預設模式,檔案必須存在,不存在則丟擲異常】
w,只寫模式【不可讀;不存在則建立;存在則刪除內容】
a,追加模式【可讀; 不存在則建立;存在則只追加內容】"+
"表示可以同時讀寫某個檔案
r+,可讀寫檔案。【可讀;可寫;可追加】
w+,寫讀
a+,同a"u
"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+模式同使用)
rur+u"b
"表示處理二進位制檔案,不能指定編碼(如:ftp傳送上傳iso映象檔案,linux可忽略,windows處理二進位制檔案時需標註)
對於非文字檔案,我們只能使用b模式,"b
"表示以位元組的方式操作,而所有檔案也都是以位元組的形式儲存的,
rbwb
ab操作檔案的方法
f.read()
#讀取所有內容,游標移動到檔案末尾
f.readline() #
讀取一行內容,游標移動到第二行首部
f.readlines() #
讀取每一行內容,存放於列表中
f.write(
'1111\n222\n
') #
針對文字模式的寫,需要自己寫換行符
f.write('
1111\n222\n
'.encode('
utf-8
')) #
針對b模式的寫,需要自己寫換行符
f.writelines(['
333\n
','444\n
']) #
檔案模式
f.writelines([bytes('
333\n
',encoding='
utf-8
'),'
444\n
'.encode('
utf-8
')]) #
b模式f.readable()
#檔案是否可讀
f.writable() #
檔案是否可讀
f.closed #
檔案是否關閉
f.encoding #
如果檔案開啟模式為b,則沒有該屬性
f.flush() #
立刻將檔案內容從記憶體刷到硬碟
f.name
檔案內游標移動
一: read(3):
1. 檔案開啟方式為文字模式時,代表讀取3個字元
2. 檔案開啟方式為b模式時,代表讀取3個位元組
二: 其餘的檔案內游標移動都是以位元組為單位如seek,tell,truncate
注意:1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
2. truncate是截斷檔案,所以檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟,因為那樣直接清空檔案了,
所以truncate要在r+或a或a+等模式下測試效果
import
time
with open(
'test.txt
','rb
') as f:
f.seek(0,2)
while
true:
line=f.readline()
ifline:
print(line.decode('
utf-8'))
else
: time.sleep(0.2)
檔案的修改
檔案的資料是存放於硬碟上的,因而只存在覆蓋、不存在修改這麼一說,我們平時看到的修改檔案,都是模擬出來的效果,具體的說有兩種實現方式:
方式一:將硬碟存放的該檔案的內容全部載入到記憶體,在記憶體中是可以修改的,修改完畢後,再由記憶體覆蓋到硬碟(word,vim,nodpad++等編輯器)
import
oswith open(
'a.txt
') as read_f,open('
.a.txt.swap
','w
') as write_f:
data=read_f.read() #
全部讀入記憶體,如果檔案很大,會很卡
data=data.replace('
alex
','sb
') #
在記憶體中完成修改
write_f.write(data)
#一次性寫入新檔案
os.remove(
'a.txt')
os.rename(
'.a.txt.swap
','a.txt')
方式二:將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最後用新檔案覆蓋原始檔
import
oswith open(
'a.txt
') as read_f,open('
.a.txt.swap
','w
') as write_f:
for line in
read_f:
line=line.replace('
alex
','sb')
write_f.write(line)
os.remove(
'a.txt')
os.rename(
'.a.txt.swap
','a.txt
')
python檔案處理
def cal input input.txt output output.txt cal方法為主程式,推薦這樣做而不是python.exe xx.py 預設引數為python目錄的兩個txt,如為其他檔案自己指定。infile file input,r 開啟源資料檔案 outfile file o...
python 檔案處理
1.開啟檔案 open a.txt 當前目錄下的a.txt open root a.txt 開啟某個目錄下的檔案 2.按行顯示檔案 a open a.txt a.readline ni hao n a.readline wo xianzai hen xiang ni n a.readline ni ...
Python檔案處理
open name mode buf read size readline size readlines size 這裡的size是指,io定義的default buffer size為單位大小 iter 迭代器迭代每行 write str writelines sequwence of strin...