今日大纲
1.编码进阶
2.文件操作
3.文件的操作方法
4.with
5.文件的更改
6.深浅copy
1.编码进阶
每个编码的存储大小:
(原ascii码表的内容) (中文)Unicode 2字节 4字节utf-8 1字节(ascii码表映射) 3字节 gbk(国标) 1字节(映射) 2字节
内存:只有unicode编码
网络传输、存储硬盘:utf-8、gbk等
编码之间的转换:
encode : unicode编码转换成指定编码
decode : 以指定编码解码成unicode编码
s = "泽州"s_utf = s.encode('utf-8')s_gbk = s.encode('gbk')print(s_utf,s_gbk)# b'\xe6\xb3\xbd\xe5\xb7\x9e' b'\xd4\xf3\xd6\xdd's_utf = b'\xe6\xb3\xbd\xe5\xb7\x9e's_gbk = b'\xd4\xf3\xd6\xdd's_utf_uni = s_utf.decode('utf-8')s_gbk_uni = s_gbk.decode('gbk')print(s_utf_uni,s_gbk_uni)#encode 编码 #str(Unicode) --> bytes(utf-8 or gbk)#decode 解码 #bytes(utf-8 or gbk) --> str(Unicode)#gbk转成utf-8 :gbk编码需要先转换成Unicode,再转成utf-8编码s_gbk = b'\xd4\xf3\xd6\xdd's_uni = s_gbk.decode('gbk')s_utf = s_uni.encode('utf-8')print(s_utf) # b'\xe6\xb3\xbd\xe5\xb7\x9e'
参照图:
2.文件操作
f = open(filepath,mode='r',encoding='utf8')
f:文件句柄
filepath:文件路径,windwos分隔路径加 \\ 或字符串前加 r 自动转义
mode:文件的操作模式
r:只读,文件不存在报错r+:读写,先读后写rb:只读二进制形式r+b:读写二进制形式w:只写,创建文件,如果文件存在则清空文件内容w+:写读,先写后读wb:只写二进制形式w+b:写读二进制形式a:追加,文件不存在则创建文件,文件存在则在文件末尾追加,a模式不可读ab:追加二进制形式a+:追加,读
encoding:文件编码解码的格式
utf-8 gbk注:如果指定了编码解码格式,不能使用二进制操作模式
3.文件的操作方法
读操作:
1.read() 一次性把文件内容全读到内存中。2.read(n) 指定读的长度,如果是以r模式读,n为字符,如果是以rb模式读,n为字节读。3.readline() 读取文件一行内容。4.readlines() 读取全部内容,以列表返回,每个元素为每行内容5.for循环读 最好的一种写法,每次只会读一行内容,内存中也只会保存一行文件的内容。
写操作:
write(str) 把数据写入到文件,永久存储,前提模式必须是可写入
其他操作:
close() 文件操作结束,关闭文件 seek(n) 定位光标位置,n是以字节来算的,如果文件中出现utf8编码汉字需要+3才能定位到下个汉字tell() 返回光标位置truncate(n) 截断数据,可不指定n,为光标之前的内容保存,指定n默认从头开始以字节截断数据flush() write()后内容并不会立即写入硬盘,而是内容在缓冲区,到达一定的量才会写入硬盘中,flush()会强制把缓冲区内容刷新到硬盘readable() 判断文件是否可读writable() 判断文件是否可写
4.with
with可以不用写文件关闭,会自动关闭打开的文件
格式为:
with open(filename,mode,encoding) as f:
注:多个open用 \ 换行写。
with open(filename,mode,encoding) as f, \ open(filename,mode,encoding) as f2:
5.文件的更改
1.占内存方式
总结:把文件所有内容读到内存,在内容中修改内容后,清空文件,把新内容写入到文件中
with open('文件修改',encoding='utf-8',mode='r+') as f: data = f.read() content = data.replace('泽','test') f.truncate(0) f.write(content)
2.占硬盘方式
总结:用for循环都读取原文件,文件一行一行的读取修改写入到新文件,内存里只有一行文件数据
import oswith open('文件修改',encoding='utf-8') as f1,\ open('temp',encoding='utf-8',mode='w') as f2: for i in f1: content = i.replace('泽州','张三') f2.write(content)os.remove('文件修改')os.rename('temp','文件修改')
6.深浅copy
浅copy:
无论在同一代码块下还是不同代码块下:
创建了一个新的外壳(如列表),列表中的所有元素都是共用的。
深copy:
无论在同一代码块下还是不同代码块下:
不仅创建了一个新的外壳,外壳里的可变数据类型(如:列表)也创建了一份,但是不可变类型数据还是共用一份。
深浅copy例子看day3预习篇。