1、Python中的编码:
ASCII 、 Unicode 、utf-8 、gbk
对于计算机来说,计算机只认识0 1字符
(1)ASCII
8位二进制编码,理论上可以存256个字符,但是在ASCII表上只有127个字符,因为英文本身就简单,每个字符一个字节(8bit=1byte)
(2)gbk、gb2312
汉字,常用的有5000个,算上简体繁体啥的,有2万多个
GB2312是GBK的前身,可以识别6000个汉字,同时兼容ASCII码表
随着时代发展GB2312不能满足我们的要求,比如少数民族汉字也需要编码。
GBK出现,包括了GB2312的所有内容,增加了近20000个新的汉字(包含繁体字)。
然后又出现了GB18030,这种编码将中国几乎所有的字符都收录了。
最常用的还是GBK。
GBK每个字符两个字节
(3)Unicode
各国都在将自己语言文字编码,ISO组织看不下去了,Unicode就应运而生了。
Unicode又叫万国码,几乎收录了世界各国的字符,每个字符占两个字节,0-65535。
(4)utf-8
uniconde是一个字符集,收录所有字符,并没有存储情况,因为不管是什么字符都是占2个字节。
为了解决存储的问题,使用utf-8,在utf-8中,英文只占一个字节,但是汉子需要三个字节
注意在Python3中,所有的字符串都是Unicode,其他数据类型都是utf-8,Windows编码是gbk

decode():解码,将其他类型转换成Unicode
encode():编码,将Unicode编码成其他类型

>>> s = '中文'
>>> b = s.encode('utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> c = s.encode('gbk')
>>> c
b'\xd6\xd0\xce\xc4'
>>> b.decode()
'中文'
>>> d = s.encode('utf8').decode('utf8')
>>> d
'中文'

注意下面,编解码时都不能越过Unicode这个中间码

python写文件设置gbk编码 python中的gbk_缓存

9.2操作文件:创建,打开,修改文件
1、打开文件
(1)open:
open(file,[option])
file 是要打开的文件
option是可选择的参数,常见有mode encoding

f = open('test.txt','w')
f.write('python 是最好的语言')   #写入内容,保存在缓存里
f.flush()    #将缓存的写入磁盘,文件是在磁盘里面,也就是flush以后写入的内容才会写进文件

(2)with形式
读完会自动关闭文件

with open('name','mode') as f:
    f.read()
    f.write()

2、文件的打开模式
r :只读模式,文件不存在会报错
w :写入模式,文件存在会清空之前的内容,文件不存在则会创建新文件
x:写入模式,文件存在会报错,文件不存在则会新建文件
a :追加写入模式,不清空之前的文件,直接将写入的内容添加到后面。
b:以二进制模式读写文件,wb,rb,ab。
+:可读写模式,r+,w+,x+,a+,这几种模式还遵循了r,w,x,a的基本原则。

3、文件的读取
read 、 readable 、readline 、readlines
(1)f.read(size)
读取文件内容,内容以字符串的形式返回。
size是可选的数值,指定字符串的长度,如果没有指定size或者指定为负数,就会读取并返回整个文件。 默认size=-1。
(2)f.readline()
一次从文件中读取一行
(3)f.readlines()
一次读取所有行,返回列表,列表中每个元素为文件中每行的数据。

f.read()
f.read(2)
f.readline()
f.readlines()

4、文件的写入
(1)f.write()
将要写入的内容以字符串的形式写入文件。
(2)f.writelines()
将要写入的内容以字符串组成的序列形式写入文件。

5、文件的保存和关闭
(1)f.flush()
因为利用write函数,内容只是写进了缓存中,但是文件是在磁盘中存储的,所以flush的作用就是将写入的内容从缓存中读出并写入磁盘中。
(2)f.close()
关闭文件

6、光标位置
(1)read函数:其实读文件的时候就是按照光标为位置光标的移动来读的。
(2)f.seek(offset,from)
移动光标,offset表示要将光标移动到什么位置,from表示起始位置,0代表文件开头,1代表当前位置,2代表文件末尾,注意这里是移动的字节数,对于Unicode每个字符占两个字节。
(3)f.tell()
查询当前光标所处的位置。

7、查看文件信息
(1)closed 查看文件是否关闭,返回布尔值
(2)mode 查看文件打开模式
(3)name 查看文件名

9.3异常处理
1、try
Python用异常对象来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或者捕捉,程序就会用所谓的回溯中止执行。
其实,每个异常都是一些类的实例,这些实例可以被引发,并且可以用很多种方法进行捕捉,使得程序可以捉住错误并且对其进行处理,而不是让整个程序失效。

try:     #调试语句块
    测试语句块
except exception1:#except后面跟可能会出错的错误类型
    语句块(上面测试语句块出现exception1错误时会运行这里)
except (exception2,exception3):   #try可以有多个except块,而且except可以同时捕捉多个异常
    语句块
except exception4 as e:   #把异常的原因赋值给e,往往在下面可以将e打印出来看结果,e就是异常对象本身
    语句块
except:     #可以不加任何的错误类,这样捕捉到任何错误都会引发这个
    语句块
else:       #没有异常发生时用执行这个
    语句块
finally:    #不管有没有异常都会执行这个
    语句块

对于异常来说,try是必须的,剩下的except,else,finally都是可选的,但是至少有一个,要不try的存在也就没有意义了。所有的异常类都继承自BaseException类。

注意:如果父类抛出异常,子类不会再获取了。

try:
    fun()
except Exception as e:
    raise Exception
except ImportError as e:   #把ImportError放在Exception放在上面还是可以的,放下面就不会再触发这个异常了
    raise ImportError
finally:
    pass
The class hierarchy for built-in exceptions is:
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

2、assert 断言

def asse(n):
    assert n!=0,'n是零'     #n!=0条件为True正常运行代码,False执行后面的代码
    return 10/n
>>> asse(0)
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    asse(0)
  File "C:/Users/dudan/Desktop/1.py", line 2, in asse
    assert n!=0,'n是零'     #n!=0条件为True正常运行代码,False执行后面的代码
AssertionError: n是零
>>> asse(-1)
-10.0

主要用assert在程序中置入检查点,基本使用和if很像,但是断言主要用于代码的调试,
3、raise 抛出异常

def ff(n):
    if n>1:
        raise Exception('你不能大于1',n)
>>> ff(2)
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    ff(2)
  File "C:/Users/dudan/Desktop/1.py", line 3, in ff
    raise Exception('你不能大于1',n)
Exception: ('你不能大于1', 2)

raise放在结束位置,捕捉到错误会,而assert放在和if等同的位置。