檔案操作方法
阿新 • • 發佈:2020-12-25
溫故知新
執行python的三個步驟
1、啟動python直譯器
2、直譯器將test.py的內容從硬碟讀入記憶體
3、直譯器執行剛剛讀入記憶體的程式碼,識別python語法,比如 x='上'
bytes型別
編碼 編碼 字元-------------------->unicode------------->其他編碼 解碼 解碼 字元<--------------------unicode<-------------其他編碼 print(x) res = x.encode("gbk") print(type(res))>>>>>>>><class,bates> 強調:在python3裡,只會將unicode格式的數字轉成字元,其餘編碼格式的數字均不會轉換 print(res) print(res.decode("gbk"))>>>>>>>b'\xc9\xcf'
檔案處理
一、控制檔案的讀寫操作模式:
r:只讀(預設的) 不能進行寫操作
w:只寫---檔案存在內容則會在開啟的瞬間清空,檔案不存在就會建立一個檔案
a:只追加寫,開啟檔案後指標會移動到檔案的末尾,不會刪除資料,只會在後面寫
二、控制檔案讀寫內容的模式
t:控制讀寫的內容都是字串型別(預設的) 特點: 1、只使用與文字檔案,不適用於圖片視訊等其他格式 2、一定要指定encoding的引數 b:控制讀寫的記憶體都是bytes型別 1、適用於所有型別,不過用於文字檔案較繁瑣,推薦用t模式 2、一定不要指定encoding引數
三、呼叫開啟檔案的方法# 在檔名前面加 r 可以避免路徑中出現\n,r可以去點字元的特殊意義
####r: 檔案不存在則報錯,存在指標會跳到檔案的開頭進行讀取檔案
```
f = open(r'a.txt',mode='rt',encoding='utf-8')
print(f.read())
f.close()>>>>>>回收作業系統資源
####w:檔案不存在會建立空文件,存在會清空內容,指標跳到開頭(切記不要用w開啟關鍵資料 ``` f = open(r'b.txt',mode='wt',encoding='utf-8') f.write("你好啊1\n") f.write("你好啊2\n") f.write("你好啊3\n") f.clujinlose() 打開了
檔案不關閉的情況下,新寫入的內容永遠跟在老內容之後
####a:檔案不存建立空文件,存在會跳到末尾,在後面追加寫,比如用來存取使用者的賬戶、
```
f = open(r'c.txt',mode='at',encoding='utf-8')
檔案不管是否關閉,開啟指標都會跳到最後
瞭解:讀寫模式(可讀可寫,很少用到)
r+t、w+t、a+t
例如:r+t模式
f = open(r'c.txt',mode='r+t',encoding='utf-8')
print(f.readable())
print(f.writable())
print(f.read())
f.write("h")
f.close()
####with功能 b模式
```
with open('1.mp4',mode='rb') as f:
print(f.read())>>>>>>>一次性讀取所有,若是檔案過大會導致記憶體卡死,崩潰
for line in f: >>>>>>>一行一行的讀取,不會佔用大量記憶體
print(line)
with open('1.mp4',mode='rb')as f ,open(r'2.mp4',mode='2b')as new_f:
for line i f: # 迴圈f line是讀一行
new_f.write(line) #把讀到的一行 寫入new_l裡面去,一行一行讀寫,有效的節省記憶體空間
```
with open('d.txt',mode='wb') as f:
msg = "你好"
f.write(msg.encode('utf-8'))>>>>>wb格式寫入需要編碼成utf-8 不然會亂碼
```
with open('a.txt',mode='rt',encoding='utf-8')as f:
res = f.read()
print(res)>>>>>>正常讀出a.txt內文字內容
res = f.read
print(res)>>>>>>輸出空白,在我呢見沒有關閉是情況下,前面的f.read已經將指標移動到了末尾,所以再讀就讀不到內容了
f.readline().......一行一行的讀取
f.readlines()........全部讀取到一個列表中
with open('a.txt',mode='wt',encoding='utf-8') as f:
lines = ['aaa\n',"bbbb\n","cccc\n"]
for line in lines
f.write(line)
等同於 f.writelines(lines)
不同的是 write.('hello) 是直接把整個字串直接寫入
而 writelines.('hello')是一個字母一個字母的寫入
瞭解:
f.flush(),因為檔案的寫入是隔一段時間寫入一次,非常急用的檔案可以用 flush()立即寫入
print(f.close)判斷檔案是否關閉
print(f.name) 檔案的名字
控制檔案指標的移動(被動控制指標的移動)
####只有在 t 模式下的read(n)代表的是字元個數(utf-8中一個英文字元一個位元組、一箇中文字元三個位元組),除此以外都是位元組個數
```
with open('a.txt',mode='rt',encoding = 'utf-8') as f:
res = f.read(6)
print(res) t模式.read(6)代表6個字元,所以正常輸出
with open('a.txt',mode='rb') as f:
res = f.read(6)
print(res) >>>b'hello\xe4\xbd\xa0' 會列印bytes格式
print(res.decode('utf-8'))>>>>解碼成’utf-8'格式就可正常讀出
with open('a.txt',mode='at',encoding='utf-8') as f:
f.truncate(6)>>>>>hello� 截斷內容,若是碰到中文三個位元組,剛好截了一個或兩個位元組就會亂碼
###主動控制指標的移動
####f.seek(移動位元組的個數,模式)
模式有三種:
0:永遠參照檔案的開頭
1:參照指標所在的當前位置
2:永遠參照檔案末尾
####注意:只有0模式可以在 t 模式下使用,1 和 2 只能在b模式下使用
```
with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0) >>>參照檔案開頭,向右移動 3 個位元組
f.seek(5,0)
print(f.tell())告訴指標所在位置
with open('a.txt',mode='rb')as f:
f.seek(-3,2)>>>>參照檔案末尾,-3 是向左移動 3 個位元組
print(f.tell())>>>>檔案的長度是從開頭到指標處
修改檔案的方式一、
####1、先將檔案的內容全部的讀入記憶體
####2、在記憶體中完成修改
####3、在修改後的內容覆蓋回原始檔
```
ps:耗費記憶體不耗費硬碟
with open('e.txt',mode='rt',encoding='utf-8')as f:
data = f.read()>>>>先讀到記憶體
with open('e.txt',mode='wt',encoding='utf-8')as f1:
f1.write(data.replace('liu','LIU') 在記憶體修改後,在覆蓋到檔案中
###修改的方式二、
####1、以讀的方式開啟檔案,然後以寫的方式開啟一個臨時檔案
####2、讀原始檔的一行內容到記憶體,然後在記憶體中修改完畢後在寫入臨時檔案
####3、刪除原始檔,將臨時檔案重新命名為原始檔
ps:耗費硬碟不耗費記憶體
import os
with open('e.txt',mode='rt',encoding='utf-8') as scr_f,
open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
for line in scr_f:
dst_f.write(line.replace('liu','LIU')
一行一行的修改後存到新的資料夾,極少的佔用記憶體
os.remove('e.txt') >>> 刪除原始檔
os.rename('e.txt.swp','e.txt')>>>>.修改新檔名變為原檔案