x='上'
#unicode的二進制------編碼encode------->gbk格式的二進制
res=x.encode('gbk')
res=x.encode('utf-8')
print(res,type(res))
#unicode的二進制<------解碼decode-------gbk格式的二進制
m=res.decode('gbk')
print(m)
'''
-
什麼是文件
文件是操作系統爲應用程序或者用戶提供一種操作硬盤的虛擬單位
強調:
文件是操作系統提供的虛擬單位
應用程序或者用戶對文件的讀寫操作其實都是向操作系統發送指令 -
爲何要用文件
文件對應的硬盤空間,如果需要考慮永久保存數據那必須使用文件 - 如何用文件
'''路徑問題
絕對路徑:
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') #前面加個r就是讓他不要轉義
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: #with .... as 就是不用在自己輸入f.close()了
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()) #這個是吧裏面的東西打印爲列表的形式,readlins也是吧全部內容讀出來
# 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) #writelines 就是for循環的調用
# 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)
瞭解:
+:不能單獨使用,必須與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')