字符编码,文件处理

软件启动的流程
打开notepad++ 来查看test.txt文档
1.从硬盘将软件程序加载到内存中
2.加载test.txt到内存中
3.执行notepad的代码将test.txt的内容输出到屏幕上

python解释器也是一个应用软件
1.从硬盘将解释器加载到内存中
2.加载test.py到内存中
3.解释器解析python语法



文本编辑器与解释器在打开同一个py文件时
前两个阶段是一致的,仅仅是第三个阶段不同


什么是字符编码?字符编码表
   编码,按照某种规范 将数据转换为二进制
为什么要编码?
   计算机只能识别0/1,那么要使用计算机则必须将所有的数据和命令都用二进制表示
   这是一个复杂的过程,所以需要一种解决方案,可以让计算机识别人类的语言

字符编码的发展史
   美国人发明了计算机,需要让计算机识别美国人的语言,所以诞生了asc编码表
   其他的国家也需要使用计算机,于是每个国建都退出了自己的编码表
   中国-GBK
   日本-shift-j
   因为每个编码表互不兼容,导致乱码问题
   为了统一全世界的编码 推出而unicode编码
   1.统一全世界的编码
   2.必须还兼容之前的GBK,shift-j

ASCII 中用八个二进制(1个bytes)

GBK 英文字母占一个字节
    中文占两个字节
    16个二进制 2**16-1=65535
   如果一个字节的首位为1 表示一个中文
   若果一个字节的首位为0 表示一个英文
    GBK不仅仅要存储数据 还要计算每一个符号占的长度

unicode 无论英文还是其他字符 都是2个字节
   为什么这么设计?不浪费空间?
   1.为了提高效率,而采取的空间换时间(效率)
   unicode的问题
   浪费空间,降低网络传输效率

为了解决上述unicode的问题、:退出了UTF-8
   utf-8是变长的
   英文占一个字节
   中文占三个字节
   生僻字占更多字节

   与GBK相同的是,都需要计算,所以不适用于内存
   适用于:硬盘和网络传输

结论就是  内存中用unicode,硬盘或网络中用UTF-8

用户输入->内存(unicode)->转换成(utf-8)->硬盘 该过程称之为编码 就是字符转为二进制的过程
硬盘上的a.txt(utf-8的二进制)-> 内存中unicode的二进制—>查编码表得到符号->显示到屏幕上
该过程称之为解码 把二进制转为符号

乱码问题?
    1.存储时与取出时使用的编码方式不一致
乱码不仅仅是因为存和取的编码不同,还可能是存的时候就已经乱了,这将导致数据流失!
所以存的时候一定要注意:
  所使用的编码方式一定要支持文档中的所有内容,即utf-8

python在执行代码之前必须从硬盘加载代码到内存,而硬盘中都是二进制数据,必须先解码为unicode
那解释器怎么知道拟采用的什么编码方式?
如果不明确自定 解释器将采用默认的解码方式,在python3中默认为utf-8而python2中默认为ASC
当你使用的是py2的时候 则需要手动制定编码方式,在文档的第一行写上 coding:uft-8
coding:uft-8

py2中当从内存访问变量时可能会乱码,例如存储时utf-8的字符但是输出时 却用了GBK
python2中u 表示 将这个变量存储为unicode编码 可以防止取出变量时乱码
数据类型也变为了unicode
1个16进制 = 0.5个字节

encode: unicode->uft-8 将unicode的字符 转为自定的二进制
decode: utf-8 ->unicode 将二进制转为unicode

文件处理:

文件是什么?
  文件是操作系统提供的一套虚拟概念
文件这个概念之所以出现 是为了简化对硬盘的操作
学习文件处理是为了将数据永久保存

打开文件的语法1
1.打开文件
  f=open('test.txt',encoding='utf-8')#是给系统发送了一个指令,让操作系统去打开文件,因为应用程序无法直接控制硬件
  
2.读取内容
  data=f.read()
  print(data)
  
3.关闭文件 不要忘记关闭
  f.close()

open close read等都是在给操作系统发送指令

打开文件的语法2:  在with代码执行完毕后会自动调用close
with open ('test.txt',encoding='utf-8') as f:
    data= f.read()
    print(data)

参数1 文件路径 可以是相对 也可以是绝对
mode 打开文件的模式 
 r(只读)
 w(只写)
 
 +(可读可写)了解即可
  + 表示可读可写
  w+ 清空源文件如果不存在则创建
  r+ 如果不存在则报错
  a+ 如果不存在则创建,光标移动到最后
  可读可写 可用于文本处理 但是对于写别的文件,一般不用,很容易造成文件损坏
 
encoding 编码方式 windows默认为GBK Linux默认为utf-8

读取内容 可以用参数指定要读取的个数,默认为-1 表示全部读取
需要注意 read(-1)仅限于文件较小时,如果文件太大会造成内存溢出
data=f.read(2000)
f.readable() 判断是否可读
f.writable()判断是否可写
line=f.readline()

使用循环 来读取全部内容1
with open(r'D:\ \ \ ,encoding='utf-8') as f:
    while True:
    line = f.readline()
    if not line:#如果line为空则表示没有内容了
           break
    print(line,end='')
使用循环 来读取全部内容2
with open(r'D:\ \ \ ,encoding='utf-8') as f:
    for line in f:
        print(line,end='') 
           
使用循环 来读取全部内容3
#一次性读取全部
with open(r'D:\ \ \ ,encoding='utf-8') as f:
  print(f.readlines())#会将每行放入列表中

读取相关函数
read()     读取全部
read(size) 读取指定大小
readlines  读取全部
readlin    读取一行
readable   是否可读

注意在W模式写 一旦打开文件 立即清空原来的内容 如果文件不存在则创建新文件
写入字符串时需要手动拼接换行符
with open(r'D:\ \ \ ,mode='w',encoding='utf-8') as f:
    f.write('矮跟')
    f.writelines('\n'.join(....))


在操作非文本文件时,必须明确指定为字节模式
b 用来指定为字节模式
注意:
b 必须与r\w连用 rb(readBytes)\wb(writeBytes)
当文件为字节模式时 不能指定encoding参数!

默认情况下时读写文本模式 也就是t模式同样需要与r\w连用
rt(readText)\wt(writeText)
t模式下 python解释器会自动进行编码和解码而b模式不会

当模式为字节模式时(rb)单位为字节
#循环读取全部内容

with open('xxx.png',mode='rb') as f:
    while True:
    data = f.read(1024)
    if not data:#如果data为空则意味着文件读完了
         break
    print(data)
    
    
在b模式只能写入字节


追加写入: a 表示追加写入 不会清空原数据 会把光标移动到最后

控制文件的打开模式
    r\w\a
控制操作文件内容的模式
    t\b
    
t\b 必须与打开模式连用
各种组合如下:
rt wt at rb wb ab r+ w+ a+

关于文件操作的常用函数
read
readline
readlines
readable

write
writelines
writeable

关于编码的两个函数
encode  编码
decode  解码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值