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这个中间码
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等同的位置。