一、字符编码。

  1.

  在计算机的运行中,有三大部分组成,计算机硬件,操作系统,应用程序,当使用者在使用文档编写文字时,所显示的所有字符都存储在内存中,随后再存储在硬盘里,(仅限文字),所以,当美国人发明电脑时,都是基于自己国家的文字编写的程序,所以,美国人发明了属于自己国家的字符表,也就是ASCLL码,,因为英文字母很少,加上一些特殊符号,阿拉伯数字等,ASCLL只有125位左右。一个字符码也就8bit。下面是数据的换算。

  8bit=1Bytes

  1024Bytes=1KB

  1024KB=1MB

  1024MB=1GB

  1024GB=1TB

  1024TB=1PB

  然而,美国人发明的电脑只能输入英文,中国的字是显示不出来的,于是,中国人需要自己写一个表让电脑看懂中国,于是GBK出现了,GBK最多有2**16=65535个字符,每一个字符站2B。

  既然中国人可以,那日本人,韩国人等都可以有,于是所有的国家根据自己的语言,编写了属于自己国家的字符码。

  当每个国家都想着有能识别自己国家的码时,万国码出现了(unicode),万国码几乎容纳了所有语言的编译与翻译,它同一使用2个Byte表示。

  至此为止,所有的表,在内存与硬盘中所都是一样的,然而万国码对cpu有这巨大的负担,原本1B的字符现在需要2B才能被存储,使用起来也相当麻烦。

  所有,人们想出了一个方法,在内存中使用unicode,而再存储的时候使用另一个编码——utf-8,unicode向utf-8转换时,会将英文字符变成一个B,而将中文字符变成3个B。

  总结。

  unicode两个特点.

  1。兼容万国字符

  2。与每一个国家的编码都有对应关系,

  从内存中的unicode二进制数据到硬盘中的utf-8的二进制数据称为编码(encode)

  从硬盘中的utf-8二进制数据到内存中unicode二进制数据被称为解码(decode)

  保证不乱码的核心点是:文本文件以什么类型的编码,就用什么类型的解码(*************)

  2.python2与python3的区别

  在python2 的编写是,unicode还没有盛行,所有python都已ASCLL进行编码,

  而在python3中,都使用utf-8进行编码。

  3.头文件定义字符的保存格式

  在文件的开头,可以使用以下代码定义文件的保存格式

  1. #coding:代码格式

  因为所有编码格式都支持英文字符,所以无论什么表都可以识别该代码。

  在python3中字符串默认是unicode,而在pycharm软件中,字符串默认为utf-8类型,在window终端编写程序时,使用的时GBK进行编码。

  在python3的终端中,字符串经过编码后所表现的时bytes类型的数据.

  在python2中定义中文字符串时,都会在前面添加‘u,吧字符串格式转换成Unicode’。

  (**********)

  1. x="上"
  2. print(x.encode('utf-8'))
  3. #将字符串转换成utf-8的二进制类型
  4. print(res.decode('utf-8'))
  5. #将硬盘中的utf-8二进制数解码成unicode格式的二进制。

 二。文件

  1.什么是文件

  操作系统是提供给用户操作复杂硬件的简易接口。

  2.为什么要操作文件

  人或者应用程序需要永久保存数据。

  3.如何操作文件

  通过python代码操作文件。

  在python中,可以通过open来定义一个变量f,,后对文件进行操作,语法如下:

  1. f=open('D:\Python项目\day07\a.txt',encoding='utf-8')

  其打印f后的结果是

  1. <_io.TextIOWrapper name='D:\\python日常学习资料\\7_5day07\\代码\\day07\\a.txt' mode='r' encoding='utf-8'>

  可以看到是一个接口,所以f所获得的是对计算机硬件接口的操作。

  在定义文件名时,很容易出现\t这种转义字符很容易出现文件读取错误,所以,在输入文件地址时通常会在字符前加r,意思就是取消转译。

  1. f = open(r'D:\python日常学习资料\7_5day07\代码\day07\a.txt',encoding='utf-8')

  然而,window系统的默认读取文件的方式是gbk,在读取utf-8模式的字符串时,会报错,所以可以使用encoding参数指定文件读取的方式。

  文件使用结束后可以使用f.close(),函数,将文件操作关闭,但是在使用这种方法关闭后,后续如果再想对文件进行操作,会报错误,即io口操作错误,所以python有一个方便简洁的造作文件的方法,语法如下

  1. with open(r'D:\python日常学习资料\7_5day07\代码\day07\a.txt',encoding='utf-8') as f ,\
  2. open(r'D:\python日常学习资料\7_5day07\代码\day07\b.txt',encoding='utf-8') as f1: # f仅仅是一个变量名 你把它看成是一个遥控器
  3. print(f)
  4. print(f1)

  也可以通过这种方法将多个文件介入操作。

  4.文件的处理模式

  文件有三种对文件的操作模式:

  r,只读模式

  w,只写模式

  a,追加模式

  文件有两种对文件单位的方式

  t,文本文件 以文本文件的形式操作文件

  b,二进制  以二进制的方式操作文件,注意再这个模式下encoding不可以指定参数。

  【r】其中mode指定的就是文件处理的模式R,W,A等,如果不指定,默认使用r只读模式,他,b不指定,默认指定t。

  1. with open(r'D:\python日常学习资料\7_5day07\代码\day07\a.txt',mode='rt',encoding='utf-8') as f:
  2. print(f.readable()) # 是否可读
  3. print(f.writable()) # 是否可写
  4. print(f.read()) # 一次性将文件内容全部读出

  readable()输出的是文件是否可读,writable输出的是文件是否可写。read()可以将文件一次性读出,这种方式在读大型文件时,非常损耗进程,所以可以采用如下方式操作文件

  1. print(f.readlines())

  这中方式可以一行一行的读出文件,非常适合文件的操作。

  【w】

  只写模式切记要慎用,因为它在写文件时会将原来文件全部删除,再添加新的内容。

  1. with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
  2. print(f.readable()) # 是否可读
  3. print(f.writable()) # 是否可写
  4. f.write('不不不,你没有翻~\n')

  当文件xxx不存在时,会再该文件夹添加一个名为xxx的文件。

  只写模式也有多行操作,其使用列表进行操作,将列表的每个元素作为一行进行写入。使用writelines()

  1. with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
  2. l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
  3. f.writelines(l)

  【a】只追加模式

  在a模式中,可以在文件末尾添加内容,如果文件夹没有该文件,则会添加该文件后追加内容。

  1. with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
  2. print(f.readable()) # 是否可读
  3. print(f.writable()) # 是否可写
  4. f.write('我是小尾巴\n')

  当有该文件时,会将光标移到文件末尾。不清空原来的文件内容。

  【t】对文本文件的操作

  在t模式下,操作出的数据是字符串。

  1. with open('text1','rt',encoding='utf-8') as f:
  2. print(type(f.read(3)))
  3. #输出结果>>><class 'str'>

  需要对其进行字符串类型定义,一般使用utf-8,在写入数据时也需要使用文本类型。

  1. with open('text1','wt',encoding='utf-8') as f:
  2. f.write('我我我我我我')
  3. #输出结果>>>我我我我我我

  【b】二进制模式

  在这个模式下,encoding的值不需要被定义,而且读取文件时是以二进制的类型进行操作

  1. with open('text1','rb') as f:
  2. print(f.read())
  3. print(type(f.read()))
  4. #输出结果>>>b'\xe6\x88\x91\xe6\x88\x91\xe6\x88\x91\xe6\x88\x91\xe6\x88\x91\xe6\x88\x91'
  5. #<class 'bytes'>

  在写入数据时也是按照二进制写如,如果写入字符串类型会报错。

  1. with open('text1','wb') as f:
  2. f.write('我我我')
  3. #输出结果>>>报错

  所以,这里可以通过两种方法进行转换,1,使用encode()函数进行编码,将输入内容 编成二进制

  1. with open('text1','wb') as f:
  2. f.write('我我我'.encode())
  3. #输出结果>>>我我我

  2,使用bytes直接将字符串编码

  1. with open('text1','wb') as f:
  2. res='我我我'
  3. f.write(bytes(res,encoding='utf-8'))
  4. #输出结果>>>我我我

  在读取文件时也可以通过解码和转换字符串的方式

  1. with open('text1','rb') as f:
  2. res=f.readline()
  3. print(str(res,encoding='utf-8'))
  4. res2=f.readline()
  5. print((res2.decode('utf-8')))
  6. #输出结果>>>我我我wwwada
  7. #
  8. #你你你

  

  1. # coding:gbk

day7_7.5 字符表与文件操作的更多相关文章

  1. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  2. DAY7 字符编码和文件操作

    一.软件与python解释器打开文件的方法 1.软件打开文件读取数据的流程: 1. 打开软件 2. 往计算机发生一个打开文件的指令,来打开文件 3. 读取数据渲染给用户(存取编码不一致:乱码) 2.p ...

  3. Day 07 字符编码,文件操作

    今日内容 1.字符编码:人识别的语言与机器识别的语言转换的媒介 2.字符与字节:字符占多少字节,字符串转换 3.文件操作:操作硬盘的一块区域 字符编码 重点:什么是字符编码 人类能识别的字符等高级标识 ...

  4. day7 七、字符编码,字符字节与文件操作

    一.字符编码 1.定义:人类能识别的是字符等高级标识符,电脑只能识别0,1组成的标识符,要完成人与机器之间的信息交流,一定需要一个媒介,进行两种标识符的转化(两种标识符的对应关系) 对应关系形成的结构 ...

  5. Python 入门基础6 --字符编码、文件操作1

    今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...

  6. Python基础之字符编码,文件操作流与函数

    一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...

  7. python基础——6(字符编码,文件操作)

    今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 *****     2.字符与字节: 字符占多少字节,字符串转化 ***     3.文件操作: 操作硬盘中的一块区域:读写操作  ...

  8. python学习道路(day3note)(元组,字典 ,集合,字符编码,文件操作)

    1.元组()元组跟列表一样,但是不能增删改,能查.元组又叫只读列表2个方法 一个 count 一个 index2.字典{}字典是通过key来寻找value因为这里功能比较多,所以写入了一个Code里面 ...

  9. Python-字典、集合、字符编码、文件操作整理-Day3

    1.字典 1.1.为什么有字典: 有个需求,存所有人的信息 这时候列表就不能轻易的表示完全names = ['stone','liang'] 1.2.元组: 定义符号()t = (1,2,3)tupl ...

随机推荐

  1. 简化wcf的service设置

    使用wcf作为c/s的通信桥梁,就免不了要写wcf service,更免不了写一些配置. 但是在把系统中所有的.net remoting service都转换成wcf service以后,发现居然有2 ...

  2. A1029 Median (25 分)

    一.技术总结 最开始的想法是直接用一个vector容器,装下所有的元素,然后再使用sort()函数排序一下,再取出中值,岂不完美可是失败了,不知道是容器问题还是什么问题,就是编译没有报错,最后总是感觉 ...

  3. 数组去重--ES6方法

    数组去重方法1:用es6的set和...扩展运算符 let arr = [1,2,3,4,4,5,2]; console.log([...new Set(arr)]) // [1, 2, 3, 4, ...

  4. jquery 属性名修改

    jquery   attr <script> // 获取class 名 $(".box").attr("class") // 修改或添加class名 ...

  5. 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

    本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...

  6. F#周报2019年第18期

    新闻 FableConf 2019开始征集提案 2019理事会选举 如同DSL一般的Elmish封装器fable-elmish,可以创建控制台或者终端界面 介绍VS Code的远程开发 F#(.NET ...

  7. 基于opencv 识别、定位二维码 (c++版)

    前言 因工作需要,需要定位图片中的二维码:我遂查阅了相关资料,也学习了opencv开源库.通过一番努力,终于很好的实现了二维码定位.本文将讲解如何使用opencv定位二维码. 定位二维码不仅仅是为了识 ...

  8. golang io中io.go解读

    目录 1. 整体大纲 2. 接口 读 写 关闭 寻址 3. 函数 读 写 复制 4. 结构体 SectionReader LimitedReader teeReader 5. 备注 根据golang ...

  9. MySQL5.6升级到5.7详细教程

    前言:最近看了下系统的数据库是5.6的,想着升级到5.7,特此记录 一.官网下载MySQL5.7rpm包(4个) 进入MySQL community download页面,默认是MySQL最新版8.0 ...

  10. linq 数据库已存在,直接添加数据

    using System.Data.Linq;using System.Data.Linq.Mapping; namespace ConsoleApplication1388{ class Progr ...