1. 程式人生 > >檔案處理,檔案的開啟方式以及檔案修改的兩種方式

檔案處理,檔案的開啟方式以及檔案修改的兩種方式


1. 什麼是檔案
檔案是作業系統為應用程式或者使用者提供一種操作硬碟的虛擬單位
強調:
檔案是作業系統提供的虛擬單位
應用程式或者使用者對檔案的讀寫操作其實都是向作業系統傳送指令

2. 為何要用檔案
檔案對應的硬碟空間,如果需要考慮永久儲存資料那必須使用檔案

3. 如何用檔案

路徑問題
絕對路徑:
win: C:\a\b\c\d.txt
linux: /a/b/c/d.txt
相對路徑: 相對於當前執行檔案所在資料夾
a/b/c/d.txt

1 開啟檔案
f=open(r'D:\脫產5期內容\day09\a.txt',mode='rt',encoding='utf-8')

print(f)

2 讀/寫檔案
data=f.read()
print(data)

3 關閉檔案
f.close() # 向作業系統傳送指令,讓作業系統關閉開啟的檔案,回收作業系統資源
print(f)
f.read()


上下文管理
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data)




一. 基本介紹
控制檔案讀寫操作的模式
r(預設)
w
a

控制檔案讀寫內容的模式(不能單獨使用,必須與r、w、a連用)
t(預設)
b


二. 詳細介紹
控制檔案讀寫操作的模式
r(預設):只讀模式,以該模式開啟檔案,當檔案不存在時則報錯,當檔案存在時檔案指標在檔案開頭

with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
print(f.readable())    是否能讀
print(f.writable())    是否能寫

line=f.readline()    一次讀一行
print(line,end='')

line = f.readline()     一次讀一行
print(line,end='')

print('第三次讀')
line = f.readline()    一次讀一行
print(line, end='')

print(data,type(data))

for line in f:
print(line)

print(f.readlines())    把檔案讀成列表
pass

w: 只寫模式,以該模式開啟檔案,當檔案不存在時建立一個空文件,當檔案存在時清空檔案內容,檔案指標在檔案開頭
with open('a.txt',mode='wt',encoding='utf-8') as f:
print(f.readable())    是否能讀  
print(f.writable())    是否能寫

在打開了檔案不關閉的情況下,連續的寫入,新寫的內容總是跟在老內容之後
f.write('你瞅啥\n')
f.write('瞅你那熊樣\n')
f.write('巴拉巴拉。。。\n')

lines=['1111\n','2222\n','3333\n']
for line in lines:
f.write(line)

f.writelines(lines)    相當於迴圈line

f.write('aaaa\nbbb\ncccc\n')

a: 只追加寫模式,以該模式開啟檔案,當檔案不存在時建立一個空文件,當檔案存在時不清空檔案內容,檔案指標跳到檔案末尾
with open('c.txt',mode='at',encoding='utf-8') as f:
f.write('你好阿斯蒂芬\n')
f.write('adfasdf\n')

f.writelines([1,2,3])

控制檔案讀寫內容的模式(不能單獨使用,必須與r、w、a連用)
t(預設):無論讀寫都是以字元為單位的,只能操作文字檔案,必須指定encoding引數
b:無論讀寫都是以bytes為單位的,可以操作所有檔案,一定不能指定encoding引數
with open('a.txt',mode='rb') as f:
data=f.read()
print(data,type(data))
print(data.decode('utf-8'))

with open('01.mp4',mode='rb') as f:
data=f.read()
print(data,type(data))



with open('a.txt',mode='wb') as f:
f.write('字元行啊士大夫阿斯蒂芬撒旦發'.encode('utf-8'))

練習:拷貝檔案小程式
with open('01.mp4',mode='rb',) as read_f,\
open(r'D:\1111.mp4',mode='wb') as write_f:
data=read_f.read()
write_f.write(data)


升級版:
拷貝檔案
one=input("原始檔: ")
two=input('目標檔案: ')
with open(one,mode='rb')as read_f,\
open(two,mode='wb')as write_f:
data=read_f.read()
write_f.write(data)




瞭解:
+:不能單獨使用,必須與rwa連用,r+ w+ a+
with open('a.txt','r+t',encoding='utf-8') as f:
# print(f.readable())
# print(f.writable())

data=f.readline()
print(data)
f.write('劉清蒸')


with open('a.txt','r+t',encoding='utf-8') as f:
print(f.readable())
print(f.writable())

f.seek(10)
print(f.tell())
f.write('你好啊')



方式一:
1. 以讀的方式開啟原始檔
2. 將檔案內容一次性全讀入記憶體,在記憶體完成修改
3. 以寫的方式開啟原始檔,然後將修改後的結果一次性寫入原始檔
總結:
優點:在檔案修改過程中硬碟只存在一份資料
缺點:浪費記憶體

with open('b.txt',mode='rt',encoding='utf-8') as f1:
msg=f1.read()
new_msg=msg.replace('alex','大SB')


with open('b.txt',mode='wt',encoding='utf-8') as f2:
f2.write(new_msg)

方式二
1. 以讀的方式開啟原始檔,以寫的方式開啟一個臨時檔案
2. 讀取原始檔的一行內容到記憶體中,將修改的結果寫入臨時檔案,迴圈往復直到改
3. 刪除原始檔,將臨時檔案重新命名為原始檔名
優點:同一時間在記憶體中只有檔案的一行內容,更節省內容
缺點:在檔案修改過程中硬碟只存在兩份資料

import os

with open('b.txt',mode='rt',encoding='utf-8') as read_f,\
open('.b.txt.swap',mode='wt',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('大SB','alex'))


os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')