字符编码复习与文件基础(二)

1.字符编码
字符与数字的对应关系表
ASCII:能识别英文字符,1Byte=1英文字符
hello
8bit|8bit|8bit|8bit|8bit

GBK:汉字与英文字符,2Byte=1中文字符 1Byte=1英文字符
你a好
8bit|8bit|8bit|8bit|8bit

1111 1111|1111 1111 首位用来标识中文字符的一部分

0111 1111|0111 1111 英文字符首位是0
在内存编码中保存的是去掉首位进行保存的


Unicode
1.能够兼容万国字符
2.与其他任意编码的二进制数都有映射关系
Unicode->GBK 编码
GBK->Unicode 解码
UTF-8:是Unicode的精简版(转换格式)3个Bytes=1中文字符,1Byte=1英文字符

2.在python中字符编码的应用
1.保证执行python程序的前两个阶段不乱码,加文件头
在文件的首行写入:#coding:文件存的时候用的编码

2.字符串类型的演变:
python2有两种"字符串"类型:
类型一
#coding:gbk
x='上' #'上'存成了GBK编码侯的二进制

类型二
x=u'上' #'上'存成了Unicode类型

python3有两种“字符串”相关类型
x='上'#上存成了Unicode编码侯的二进制

x.encode('gbk')转换为二进制编码是byte类型
字符串可以编码成二进制类型

3.总结:
1.保证不乱码:以什么编码存的就应该以什么编码取
2.在python2中定义字符串,应该加上前缀u
3.在编写python文件时必须加上文件头

文件处理的基本流程:
1.打开文件 拿到文件对象(文件对象====>操作系统打开的文件==>硬盘)
f=open(r'文件的路径',mode='文件打开模式',encoding='字符编码') r代表原生字符串

2.操作文件:读/写
f.read()
f.readlines()
f.readline()
f.readable()


3.向操作系统发送指令关闭文件,回收操作系统资源
f.close()
f=open(r'文件位置',mode='rt',encoding='utf-8')
f.close()
print(f)


二:上下文管理
with open(r'文件位置',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data)
print('='*100)
for line in f:#读不出内容 第一步已经把文件内容读完文件指针已经指向到最后了
print(line)

今日内容
1.文件打开模式
2.文件操作方法
3.文件内指针移动(不是主动控制的 是被动触发的)

打开文件的模式有三种纯净模式:r(默认的) w a
控制操作文件内容的两种模式:t(默认的) b
大前提:tb模式均不能单独使用,必须与纯净模式结合使用
t文本模式:
1.读写文件都是以字符串为单位的
2.只能针对文本文件
3.必须指定encoding参数
b二进制模式:
1.读写文件都是以Bytes/二进制为单位的
2.可以针对所有文件
3.一定不能指定encoding参数

二 打开文件模式详解
1.r只读模式:在文件不存在时则报错,文件存在文件内指针直接转到开头
with open('文件位置',mode='rt',encoding='utf-8')
print(f.readlines())


2.w只写模式:在文件不存在时创建空文档,文件存在会情况文件 文件指针跑到文件开头
with open('b.txt',mode='wt',encoding='utf-8') as f:
print(f.writable())#是否可写 返回true 可写
print(f.readable())#是否可读 返回false 不可读
f.write('你好\n')
f.write('我好\n')#强调:在文件不关闭清空下,后写的内容一定跟着前面先写内容的后面
f.write('大家好\n')
f.write('111\n22222\n3333\n')
lines=['1111','2222','33333']
for line in lines:
f.write(lines)
f.writelines(line)

#用户认证功能
inp_name=input('请输入你的名字:').strip()
inp_pwd=input('请输入你的密码:').strip()
with open(r'.txt',mode='rt',encoding='utf-8') as f:
for line in f:#把用户输入的名字和密码与读出内容做比对
u,p=line.strip('\n').split(':')
if inp_name==u and inp_pwd==p:
print('登陆成功')
break
else:
print('账号和密码错误')

#注册功能:
name=input('username>>>:').strip()
pwd=input('password>>>:').strip()
with open(r'.txt',mode='at',encoding='utf-8') as f:
info='%s:%s\n'%(name,pwd)
f.write(info)
3.a只追加写模式:在文件不存在时会创建空文档,文件存在会将文件执政直接移动到文件末尾
with open(r'.txt',mode='at',encoding='utf-8') as f:
f.write('4444\n555\n')

#r+ w+ a+
with open(r'a.txt',mode='r+t',encoding='utf-8') as f:#r+t可读可写模式
print(f.readline())
f.write('你好')

b:读写都是以二进制为单位
with open(r'.txt',mode='rb') as f:
print(f.readline())
f.write('你好')
with open(r'.txt',mode='rb') as f:
print(f.readline())
data = f.read()
print(data.decode('utf-8'))#利用utf-8进行解码
with open(r'1.png',mode='rb') as f:
print(f.readline())
data = f.read()
print(data)#不能解码 只能输出二进制

with open(r'.txt',mode='wb') as f:
f.write('你好'.encode('utf-8'))
复制粘贴的原理
with open(r'1.png',mode='rb') as f:
data=f.read()

with open(r'2.png',mode='wb') as f:
f.write(data)
# 拷贝工具
src_file=input('源文件路径: ').strip()
dst_file=input('目标文件路径: ').strip()
with open(r'%s' %src_file,mode='rb') as read_f,open(r'%s' %dst_file,mode='wb') as write_f:
for line in read_f:
# print(line)
write_f.write(line)

你可能感兴趣的:(字符编码复习与文件基础(二))