07字符编码,文件处理

今日内容:
1. 字符编码
  1. str字符串类型的演变过程   
  2. 程序不乱码的解决方案
  3. 文本文件的处理
2. 文件处理
  1 基本的处理流程open
  2 操作文件的模式:
  r w a
  t b +
  3 文件操作的方法read,write
  4 修改文件的两种方式



一、字符编码

前提储备知识点:
1. 计算机系统分为三层:
应用程序
操作系统
计算机硬件

2. 运行python程序的三个步骤
1. 先启动python解释器
2. 再将python文件当作普通的文本文件读入内存
3. 解释执行读入内存的代码,开始识别语法

 

 

字符编码


1. 什么是字符编码?

自己:什么是字符?就是人类的文字符号。
字符编码表: 人类的字符<-----双向对应------->数字。

1Bytes=8bit
缩写:1B=8b 义:1字节等于8个二进制位

2.字符编码发展史:

ASCII码:只能识别英文字符,文字与数字的对应关系:1英文字符用8bit来表示。
用8个二进制bit(比特位)位表示一个英文字符


GBK:能识别汉字与英文,1汉字用16bit来表示,1英文字符用8bit来表示。
Shift_JIS
Euc-kr

unicode:能够识别万国字符,  1字符用2Bytes=16bit来表示。
两大特点:
1. 能够兼容万国字符。
2. 与各个国家的字符编码都有映射关系。


注意:utf-8:是unicode的转换格式。utf-8将原先的英文、中文Unicode码,转变为1个英文字符=1Bytes 1汉字=3Bytes。


重点理论:
1 编码与解码:
人的字符---编码-->unicode的二进制-------编码----->GBK的二进制
GBK的二进制-----解码-->unicode的二进制----解码->人的字符

2\ 解决乱码问题的核心法则:
字符用什么编码格式编码(即存)的,就应该用什么编码格式进行解码(即读)。

3\ python解释器默认的字符编码:
python2:ASCII
python3:UTF-8

 

文件的执行过程:

  1.前两阶段得出结论:

  通过文件头可以修改python解释器默认使用的字符编码。
  表现形式:在文件首行写:#coding:加上文件当初存的时候用的字符编码。

  2.第三阶段文件运行过程中,得出结论:

  针对python2解释器中定义字符串应该:
  x=u"上"

  否则p2中默认编码是ASCII,会将字符串存为ASCII码。!!!


  对于python3解释即便是x="上"不加u前缀也是存成unicode。

  因为在python3中默认编码是Unicode
  x='上' # '上'存成了uncidoe

unicode--------encode编码----------->gbk
res=x.encode('gbk') #res是gbk格式的二进制数,称之为bytes类型

gbk(bytes类型)-------decode解码---------->unicode
y=res.decode('gbk') #y就是unicode格式的二进制数。

 

关于字符编码的操作:
1. p2或p3编写python文件/程序,首行应该加文件头:#coding:文件存时用的编码。这么做为了什么?为了解码成功不乱码。
2. 用python2写程序,定义字符串应该加前缀u,如x=u'上'。
3. python3中的字符串都是unicode编码的,python3的字符串encode之后可以得到bytes类型。


2. 为何字符要编码?
人类与计算机打交道用的都是人类的字符,而计算机无法识别人类的字符,只能识别
二进制,所以必须将人类的字符编码成计算机能识别的二进制数字。

 

3. 如何用字符编码?

 

二、文件处理

#coding:utf-8
'''
1 什么是文件?
文件是操作系统提供给用户/应用程序的一种虚拟单位,该虚拟单位直接映射的是硬盘空间。

2 为何要处理文件?
用户/应用程序直接操作文件(读/写)就被操作系统转换成具体的硬盘操作,从而实现
用户/应用程序将内存中的数据永久保存到硬盘中。

3 如何用文件?


'''
一。 文件处理基本的三个步骤:
     1.打开文件赋值给f;
    2.操作文件;
    3.关闭文件。
# f=open(r'c.txt',mode='r',encoding='utf-8') # open函数得到文件对象(此操作占用应用程序的内存资源)------》操作系统打开的文件(此操作占用操作系统的内存资源)
# # print(f) #f绑定的是文件对象。
# data=f.read()
# f.close() # close函数是向操作系统发送信号,让操作系统关闭打开的文件,从而回收操作系统的资源。

1.加r用于字符串中是绝对路径中有\的时候。
2.路径分为绝对路径、相对路径。
  绝对路径:从盘符到文件后缀完整的路径。
  相对路径:从你现在所在的位置来找想找的文件的路径。

3.第一个r是rawstring的简写,义:原生字符串。取消字符串中的转义作用。
4.encoding=‘。。。’义:按指定的字符编码去解码。

注意:f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。


二。 上下文管理,就是with...as...语法。
with open('python.txt') as f:
   for line in f:
       print line

代码非常简洁,但是你是否深入理解这其中具体流程呢? 

上下文管理运行流程是:根据文件名打开一个文件,如果无异常抛出,把文件对象赋值给f,然后用迭代器遍历文件中每一行,当完成时,关闭文件;

而无论在这段代码的任何地方,如果发生异常,此时文件仍会被关闭。(来自Python那些事)


# with open(r'c.txt',mode='r',encoding='utf-8') as f,\
open(r'b.txt',mode='r',encoding='utf-8') as f1:

# 读写文件的操作
# pass

# 文件的纯净打开模式:r(默认的,即打开方式默认为只读) w(只写) a(只追加)。
# 决定文件内容表现形式的模式:
# t(默认的,即表现方式默认为文本模式):操作文件内容都是以字符串为单位,会自动帮我们解码,必须指定encoding参数
# b(表现方式是二进制模式): 操作文件内容都是以Bytes(二进制)为单位,硬盘中存的时什么就取出什么,一定不能指定encoding参数
# 总结:t模式只能用于文件本文件的操作,而b模式可以用于任意文件的操作。
# +
总结:t、b、+不能单独使用,只能跟纯净形式一块用,不会影响文件存在与否时的操作、和指针的位置,不影响。

# r模式:只读模式,1.在文件不存在时则报错;2.如果文件存在时文件指针跳到文件的开头
文件的操作/内置方法:
# with open(r'c.txt',mode='rt',encoding='utf-8') as f:
# print(f.read())
# print(f.readable())
# print(f.writable())
# f.write('hello') #此操作会报错。证明了只读方式打开时,只能读。

# data=f.read() #read()读取所有内容。
# print(data,type(data))#并且返回字符串类型。

# with open(r'c.txt',mode='rb') as f:
# data=f.read()
# # print(data,type(data))
# res=data.decode('utf-8')
# print(res)

读文件内容的方法:
1.read() 返回读取所有内容。

2.readline() 返回读一行内容。
3.readlines() 返回一个全部内容的列表。

# with open(r'c.txt',mode='rt',encoding='utf-8') as f:
# # line=f.readline()
# # print(line)
# # line1=f.readline()
# # print(line1)
# # line2 = f.readline()>>>文件打开没关,进行读一行操作时,指针停在上次操作结尾处。
# # print(line2)
>>>

bob:123

jack:456

tom:789

输出结果每行之间有空行。原因:文本文件本身读取每一行时,电脑把读完换行符当做一行,所以把文件默认的换行符也读取出来了。

print(line)打印操作中,默认有个end='\n',这样出现两个换行符,导致空行出现。

# with open(r'c.txt',mode='rt',encoding='utf-8') as f:
# # line=f.readline()
# # print(line,end='')
# # line1=f.readline()
# # print(line1,end='')
# # line2 = f.readline()>>>文件打开没关,进行读一行操作时,指针停在上次操作结尾处。
# # print(line2,end='')
#
# lines=f.readlines()
# print(lines) >>>输出:['bob:123\n', 'jack:456\n', 'tom:789']
# with open(r'c.txt',mode='rt',encoding='utf-8') as f:
# line=f.readline()
# print(line,end='')>>>文件打开关了,又打开进行读一行操作时,指针重新在文件开头。



4.循环读文件全部内容的方法:
# with open(r'c.txt',mode='rt',encoding='utf-8') as f:
# for line in f:
# print(line,end='')

 

posted @ 2018-09-19 17:33  timm_book  阅读(57)  评论(0)    收藏  举报