编码的进阶,文件操作,深浅copy
编码的进阶
不同编码之间的010101是不能相互识别的
网络传输,数据存储到磁盘 使用的010101这种二进制,不能使用Unicode编码本去编译 占用字节数太多 占空间 占流量
大背景:python3x版本
str:它在内存中的编码方式:Unicode
但写入文件的内容 传输别人的数据 一般都是str
矛盾: 传输 储存不能用Unicode 但python3x又要用str操作
所以利用str发送或传输时 ...代码... (转换 将Unicode便把转为非Unicode)
bytes: 一种数据类型 与str几乎一模一样 表现形式 str:'taibai' bytes:b'taibai'
与str差别: str在内存中的编码:Unicode bytes编码是非Unicode
中文:str 表现形式为'中国'
bytes : b'\xe4\xb8\xad\xe5\x96\xbq
str ---> utf-8 bytes
s1 = '太白'
b1 = s1.encode('utf-8')
print(b1)
终极转换
GB 2312 UTF-16
Unicode
utf-8 gbk
utf-8转化为gbk
s2 = s1.decode('utf-8') 转为Unicode 再转为 s2.encode('gbk')
文件操作的初识
想打开一个文件需要三要素:
文件路径:path
编码方式:utf-8 gbk 等
具体的操作:读 写 读写 写读等
f = .open('路径格式',encoding='编码方式',mode='操作')
print(f.read())
f.close()
打开文件第二种办法:
with open('文件路径',encoding='编码类型',mode='操作类型')as f1
好处是省去了写f.close()
缺点是如果同时操作两个句柄,可能会因为第一个没来得及关闭就去操作下一个,导致第一个没有close,会报错
f 是变量 是文件句柄
open()是python的内置函数
Windows:默认编码 gbk Linux ms:默认编码utf-8
操作文件流程:
1.打开文件,产生一个文件句柄
2.对文件句柄进行相应的操作
3.关闭文件句柄
可能出现的问题:
路径问题
\与后面内容构成命令 多加一个\
编码问题
编码要与文件储存时的编码保持一致
错误
有的电脑会隐藏文件后缀名 可设置显示后缀名
文件的读
有四种模式 r r+ rb r+b
四种模式下,还有五种读文件的不同方式
r 在同一个文件夹下,是相对路径 可以直接写文件名而不用写路径
f1 = open('文件路径',encoding='编码方式') 如果进行读的操作,就不用加mode操作方式
print(fi.read())
f1.close() 全部读取,读取出来的数据类型是str
在r模式中 n代表字符
f1 = open('文件路径',encoding='编码方式')
print(f1.read(3))
f1.close() 按字符读取
print(f1.readline()) 按行读取,写几行这个代码,就读取几行
print(f1.readlines()) 会返回给出一个列表 列表的每一个元素就是原文件的每一行
以上四种操作只能操作小文件 大文件全部读取的话会占用内存,导致计算机崩溃
循环读取:
f1 = open('文件路径',encoding='编码方式')
for line in f1:
print(line)
f1.close() 每次只输出一行 输出一行之后取输出下一行 不占用内存
rb
以字节的形式读取 带b的一般操作的都是非文字类的文件(图片,视频等)
f1 = open('文件路径',encoding='编码方式',mode='rb')
print(f1.read())
f.close() 获得文件字节
文件的写
分为w w+ wb w+b
只有一种模式:全部写入
f1 = open('文件路径',encoding='编码方式',mode='w')
f.write('写内容')
f.close() 如果没有文件 就创建一个文件 并写入内容
f1 = open('文件路径',encoding='编码方式',mode='w')
f.write('新内容')
f,close() 如果有文件,先清空,后写入 文件没有close的时候,write多少就写入多少
wb
f1 = open('文件路径',encoding='编码方式',mode='rb')
content=f1.read() 把图片读取出来
f1.close()
f2 = open('新文件路径',encoding='编码方式',mode='wb')
f2.write(content) 创建一个新文件,将原文件代码写入
f2.close()
文件的追加
共有四种 a ab a+ a+b
f = open('文件路径',encoding='编码方式',mode='a')
f.write('内容') 没有文件 创建文件 写入内容 有文件 追加内容至末尾
f.close()
r+ 读写 先读后写
f1 = open('文件路径',encoding='编码方式',mode='r+')
content=f1.read()
print(content)
f1.write('666')
f1.close()
其他操作
readable 判断文件是否可读
writable 判断文件是否可写
光标默认位置在文件最开始
f1 = open('文件路径',encoding='编码方式)
f1.seek(int) 按照字节调整光标位置
print(f1.tell(1)) 获取光标位置
f1.close()
truncate 对原文件进行截取 ,必须在可写状态下使用 光标调整对他无用 只能从头开始 操作方式必须是r+
文件的改
1.以读的方式打开原文件
2.以写的方式创建一个新文件
3.将原文件的内容读取出来 按照你的要求改成新内容 写入新文件
4.删除原文件
5.将新文件重新命名为原文件
import os 辅助模块 帮助删除
1.2步
with open('文件路径',encoding='编码方式)as f1,\
open('文件路径',encoding='编码方式',mode='w')as f2:
3
old_content=f1.read()
new_content= old_content.replace('旧','新')
f2.write(new_content)
4
os.remove('原文件')
5
os.rename('新文件','原文件')
这种方式read全部读取 占用内存太大 因此可以分行读取处理
with open('文件路径',encoding='编码方式)as f1,\
open('文件路径',encoding='编码方式',mode='w')as f2:
for old_line in f1:
new_line=old_line.replace('旧','新')
f2.write(new_line)
os.remove('原文件')
os.rename('新文件','原文件')
深浅copy
浅copy
以列表举例 dict set 也可以copy
copy 复制 但不能完全复制
l1 = [1,2,3,[1,2]]
l2=l1.copy()
只是copy了一个外壳 相当于开辟一个新空间装列表 但没有内容 内容用的还是l1 共用一个
给l1添加一个元素 l2不变 但给l1【-1】添加一个元素 l2也跟着添加一个元素
l1 l2 id不同 但包含的内容的id相同 无论在不在一个代码块 都是共用一个
深copy import copy
l1 = [1,2,3,[1,2]]
l2=l1.copy()
l1[0] l2[0] id相同
l1[-1] l2[-1] id不同
不可变的数据类型共用一份 可变的数据类型l2重新创建一份
深copy不仅复制创建一个新外壳,外壳里面可变数据类型也创建一份新的 但不可变得数据类型就共用一个