一、文件操作
1、编码问题
gbk :汉字编码,cp936(另一个名字),汉字占2个字节
utf-8: unicode,汉字占3个字节
ascll码: Mac默认的编码
2、open函数 (显示紫色,内置函数)
open(file,mode='r',......) #前面一个必备参数是输入文件,后面的mode是打开方式
3、相对路径和绝对路径
f=open('abc.txt','w') #在py文件旁边创建了一个txt文件,在文件的同一层创建文件,这边是相对路径 f=open(r'F:dcache.txt,'w') #具体到什么位置,这边是绝对路径 f是一个文件流(输入输出流)
4、文件的打开模式
r #只读模式,文件不存在时会报错
w #写入模式,文件存在会清空之前的内容,文件不存在会新建文件
x #写入模式,文件存在会报错,文件不存在会新建文件
a #追加写入模式,不清空之前的文件,直接将写入的内容添加到后面
b #以二进制模式读写文件,wb、rb、ab
+ #可读写模式,r+、w+、x+、a+,这几种模式还遵循r、w、x、a的基本原则
w
f=open('abc.txt','w') #操作以后会将原文件的内容清空,若不存在文件,则会新建文件,w+情况下会遵循w的基本原则
r
f=open('a.txt','r') #r模式是只读模式,文件不存在则会报错,前提是文件必须存在
x
f=open('abc.txt','x') #文件存在就会报错,文件不存在就会新建文件
a
f=open('abc.txt','a') #不清空原文件内容,直接要写入的内容添加到后面
b
f.write(b'abcd') #在用b的时候必须在输入内容前放一个b,后面必须是以二进制形式
f.write() #将要写入的内容以字符串形式通过write方法写入文件中。
文件的读取
f.read(sizw) #读取文件的内容,将文件内容以字符串形式返回。
f.readline() #从文件中读取单独一行
f.readlines() #一次读取所以,返回一个列表,列表的元素为文件行的内容
f=open('1ucky.txt','r') f.read() 'aaaa bbb ccc ddd' 换行 f.read() #再读一遍,返回'' #没值了 f.seek(0,0) #前面一个参数表示一个偏移量,后面一个参数表示起始位置,是默认参数,这个0可以不写 f.read() #又可以读出来 f.readline() 'aaaa ' #读取第一行内行和换行(从文件中单独读取一行) f.seek(0,0) 0 >>> f.readlines() ['aaaa ', 'bbb ', 'ccc ', 'ddd']
文件写入 2种
f.write() #将要写入的内容以字符串行书通过,write方法写入文件中
f.writelines() #括号里必须是由字符串元素组成的序列
f=open('1ucky.txt','a+') f.write('lingang') 7 f.write('lin刚') 4
f=open('1ucky.txt','a+') f.writelines(['6666 ','7777']) f.flush() aaaa bbb ccccc ddd6666 7777 f.writelines([' ','6666 ','7777']) f.flush() #要换行前面加 (要自己写进去) 以序列类型由字符串元素组成序列 f.tell() #返回字节 f.seek(10,0) 偏移10个 10 f.readline()
f.closed
False #文件还没关
f.mode
'a+' #返回打开文件的模式
f.name
'abc.txt' #打开的文件名
f.encoding
'cp936' #表示什么编码
要读取文件,先要打开一个文件: f=open('abc.txt','r') 然后读取文件: f.read() 以字符串的形式读取出来,换行用 形式书写 若再读取一遍 f.read() 输出: '' #原因是读取过一遍后指针(光标)到了读完以后的点,再往后面读的话就是空的字符串 f.seek(0,0) #光标位置,前面一个参数表示偏移量,后面一个参数表示起始位置,默认起始位置为0,可以表示为f.seek(0),可以重置光标
f.readline()
f.readline() #将第一行的内容以字符串的形式读取出来,包括换行 f.readlines() #一次读取所有,返回一个列表,列表的元素为文件行的内容
文件的写入
f.write
f=open('abc.txt','a+') f.write('liugang') #返回输入内容的长度 f.flush() #将上面的内容冲刷进去 f.readlines() #括号里面必须是以字符串元素组成的序列类型(列表,元组)写进去,换行 需要自己写进去 f.flush()
光标位置
f.tell() #返回光标在文件中的位置 f.seek(offset,from) #常用f.seek返回其实起始位置
8、 查看文件信息
f.closed #查看文件是否已经关闭,返回布尔值 f.mode #返回(查看)文件打开模式 f.name #返回(查看)文件名
9、with 形式打开文件,里面的语句执行完后会自动关闭文件
with open('文件名','w') as f: f.write('abcde')
返回:5
文件能够自己冲刷和关闭
异常语法:Exception hierarchy
BaseException
try:
a b=1 运行时会出现a未被定义的语法错误,随后b=1也不再运行,用下面的测试错误后,b=1就可以被调用了 try: a except NameError: #名字错误 print('执行这个1错误的补救') except TypeError: #类型错误 print('执行这个2错误的补救') except Exception: #这个是错误的总目录 print('可能是其他的错误') else: #没有错误 print('我哪里错了,我没错') finally: print('无论如何我都会执行') f.close() #关闭文件
try: fun() except Exception: #错误总目录被执行后,下面的分目录就不会执行了 print('执行这个错误') 。。。 else: pass finally: pass
try: a=input('输入数字:') if a.isdigit(): print(a) else: raise TypeError #自己把错误先找出来 except Exception: print('请遵守游戏规则')
2、assert 断言 测试表达式,其返回值为假,就会触发异常
assert 1==1 #测试1-==1这个代码是不是错的,没错没有返回值,错了返回错误点及原因
with 形式打开文件,里面的语句执行完后会自动关闭文件
with open('文件名','w') as f: f.write('abcde')
返回:5
文件能够自己冲刷和关闭,不需要写flush, #能够自己冲刷和关闭
文件的写入
f.write() #将要写入的内容以字符串的形式通过write方法写入文件中。
f.writelines() #括号里必须是由字符串元素组成的序列。
保存和关闭
f.flush()在读写模式下,当写完的数据想要读取出来时,要先缓存区的内容保存到文件当中。
f.close() 关闭文件。对一个已经关闭的文件进行操作会报错。
光标位置
f.tell() 返回光标在文件中的位置。
f.seek(offset,from) #常用 f.seek(0) 返回起始位置
在文件中移动文件指针,从from(0代表起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节。
常用 f.seek(0,0) 返回起始位置。 其他了解一下
查看文件信息
closed 查看文件是否已经关闭,返回布尔值。
mode 返回文件打开模式。
name 返回文件名。
with 形式打开文件,里面的语句执行完后会自动关闭文件
with open('文件名') as f:
f.read()
1 try: 2 a=1 3 except NameError: 4 print('我有错') 5 except TypeError: 6 print('其实我错了') 7 except Exception: 8 print('你们都没错,我错了') 9 else: 10 print('啊,代码正确呀') 11 finally: 12 print('不管了,我要执行')
1 try: 2 suite1 #测试语句块 3 except exception1: 4 suite2 #如果测试语句suite1中发生exception1异常时执行 5 except (exception2,exception3): 6 suite3 #如果测试语句suite1中发生元组中任意异常时执行 7 except exception4 as reason: #as把异常的原因赋值给reason 8 suite4 #如果测试语句suite1发生exception4的异常时执行 9 except: 10 suite5 #如果测试语句suite1发生异常在所列出的异常之外时执行 11 else: 12 suite5 #如果测试语句块suite1中没有发生异常时执行 13 finally: 14 suit6 #不管测试语句suite1中又没有发生异常都会执行 15 16
注意:中间的except,else,finally都是可选的,但至少有一个,不然try就没有意义了,根据实际中的需求来选择。
所有错误类型都继承自BaseException
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
注意:如果抛出父类异常,在子类不会再获取,如下:
1 try: 2 fun() 3 except Exception as e: 4 raise Exception 5 except ImportError as e: 6 raise ImportError 7 finally: 8 pass
在上面的例子中,下面的ImportError就不会被抛出,因为ImportError继承Exception,但是可以把Exception放在后面是可以的
e可以得到系统给出的报错信息
'