1. 程式人生 > >python基礎:檔案操作

python基礎:檔案操作

一、檔案介紹
1、什麼是檔案
狹義說:文字檔案;廣義說:超文字檔案, 圖片,聲音,超連結,視訊。
2、檔案的分類
檔案大體上可以分為兩類,檔案檔案和二進位制檔案。
3、檔案的作用
使用檔案的目的是把一些資料儲存存放起來。
4、使用檔案的流程
我們操作一個檔案的流程一般是 開啟檔案,讀寫檔案,關閉檔案。通過程式操作檔案的流程也是這三步,首先開啟檔案,然後讀寫檔案,最後關閉檔案。

二、讀寫檔案簡單操作
1、讀取檔案

file 變數名  ---> 檔案控制代碼,檔案物件
file=open('a.txt',mode='r')
ret=file.read()  #將檔案中所有內容一次性讀取出來
# 最後要關閉檔案
print(ret)
file.close()

file叫做檔案控制代碼(變數)用來操作檔案
第一個引數是檔案的路徑,
第二個引數 mode=訪問檔案的模型,r 表示讀,預設也是r 模式

2、寫檔案

file=open('file/c.txt',mode='w')
file.write('abcdef')
file.close()

mode=‘w’ 表示寫檔案
注意:如果檔案不存在,會自動建立檔案(不會建立目錄)。

三、檔案許可權
讀取操作
r 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。
rb 以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。一般用於非文字檔案如圖片等。
r+ 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
rb+ 以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。一般用於非文字檔案如圖片等。

寫操作
w 開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb 以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。一般用於非文字檔案如圖片等。
w+ 開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb+ 以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。一般用於非文字檔案如圖片等。

追加操作
a 開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
ab 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
a+ 開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。
ab+ 以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

rb操作二進位制檔案

file=open('file/...',mode='rb')
ret=file.read()
print(ret)
file.close()

r+ 讀寫模式
如果文佳不存在r+模式不能自動建立檔案
b.txt檔案內容是 abcde

file=open('file/b.txt',mode='r+')
# 先寫入
file.write('xxxx')    #會從頭開始覆蓋對應長度的內容,游標移動到覆蓋內容後
# 後讀取
ret=file.read()     #此時檔案內容變為xxxxe,游標在e之前
print(ret)             #e

w+開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
b.txt檔案內容是 abcde

file=open("file/b.txt",mode='w+')   
import time
time.sleep(5)
ret=file.read()        #讀的時候先清空在讀
print(ret)        此時b.txt已經被清空,不會讀取任何內容
   # 先寫再讀
file=open("file/b.txt",mode='w+')
file.write('abcde')     在b.txt中加入了
position=file.tell()
print(position)      5

a模式
mode='a’表示往檔案末尾寫內容,不會刪除內容,不能執行讀的操作

file=open('file/a.txt',mode='a')
file.write('xxx')
ret=file.read()
#print(ret)    #只能寫不能讀
file.close()

ab 二進位制:abc
以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,
檔案指標將會放在檔案的結尾。也就是說,新的內容將會
被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
b.txt為空檔案

file=open('file/b.txt',mode='ab')
file.write('abc'.encode())       b.txt中添加了  abc
#ret=file.read()      此方法為新增操作,無法讀取
#print(ret)
file.close()

檔案拷貝

file1=open('file/a.txt')  
file2=open('file/c.txt')
ret1=file1.read()   
file2.write(ret1)    將a.txt讀出來寫入b.txt

讀操作:
readline()
readline每次讀取一行,並且自帶換行功能 每一行末尾會讀到\n
readlines()
Readlines,一次性以行的形式讀取檔案的所有內容並返回一個list,需要去遍歷讀出來
迴圈讀取
file控制代碼是一個可迭代的物件因此,可以迴圈讀取檔案中的內容,每次讀一行。

寫操作:
writelines()
file.writelines(seq) #把seq的內容全部寫到檔案中(多行一次性寫入)。

tell()
tell獲取檔案當中當前游標所在的位置

file=open('file/b.txt',mode='ab')
file.write('abc'.encode())
ret=file.tell()
print(ret)   #6
在b.txt原有內容後添加了abc,此時游標移動到所有內容之後
file.close()

(3).seek()
seek移動游標位置
引數:
offset 移動的長度(位元組)
whence 相對位置 0從開頭(預設),1從當前,2從末尾

file=open('file/b.txt',mode='ab')
file.write('abc'.encode())
ret=file.tell()
print(ret)        #9
ret1=file.seek(0,0)    此時游標移動到開頭
print(ret1)       #0
file.close() 

r模式下:
注意:r模式下,相對位置必須為0,不支援非0操作
file=open(‘b.txt’,mode=‘r’)
ret=file.read(3) #abc
print(ret)
file.seek(0,1) #r模式下,相對位置必須為0,不支援非0操作
file.seek(0,2) #跳到末尾
print(file.read(3)) #游標此時已經調到末尾,將不會讀取任何內容
file.close()

rb模式下:

file=open('b.txt',mode='rb')
ret=file.read(3)    #b'abc'   開頭的abc
print(ret)
file.seek(-3,2)
print(file.read(3)) #b'abc'   末尾的abc
file.close()

.name和mode
file.name 返回 路徑
file.mode 返回 檔案讀寫模式

file=open('b.txt',mode='rb')
print(file.name)  #返回 路徑  b.txt
print(file.mode)  #返回 檔案讀寫模式  rb
file.close()

亂碼問題:
讀寫操作的編碼不一致導致亂碼。
預設編碼是操作平臺編碼(gbk)

encodeing=’’ 指定編碼格式

with open('file/c.txt',mode='w',encoding='utf-8') as f:
    f.write('你好,世界')
    print(f)
with open('file/c.txt',mode='r',encoding='utf-8') as f:
    ret=f.read()
    print(ret)     # 你好世界