1.异常
程序语法正确但由于使用的人输入错误而引起程序中断,python解释器抛出异常,后续程序不能正常执行
如需程序正常退出,需要用try来捕获异常
1)在程序开发中,如果对某些代码的执行不确定(程序的语法完全正确),可以增加try来捕获异常
格式如下:
try:
尝试执行的代码
except:
出现错误的处理
例如:当输入的不是整数,抛出异常,但不会终止程序的执行
try:
num = int(raw_input('请输入一个整数:'))
except:
print '请输入正确的整数'
# 无论是否有异常,程序都会正常执行
print '*' * 50
执行结果:
当输入正确:
当输入不正确:
2)当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
# 输入一个整数,用24除以这个整数
try:
num = int(raw_input('请输入一个整数:'))
result = 24 / num
print result
# 输入的不是数字,ValueError为python解释器抛出的异常
except ValueError:
print '请输入正确的整数'
# 0不能做除数
except ZeroDivisionError:
print '0不能做除数,请重新输入一个整数'
执行结果
当输入字母
当输入0
3)捕获未知错误
在开发的时候,要判断所有可能数县的错误,是有一定难度的,如果希望程序无论出现任何错误,都不会因python解释器抛出异常而终止,可以再增加一个except
try:
num = int(raw_input('请输入一个整数:'))
result = 24 / num
print result
# 捕获未知错误
except Exception as result:
print '未知错误%s' % result
执行结果:
输入字母
输入0
4)完整代码
try:
# 尝试执行的代码
pass
except 错误类型1:
pass
except 错误类型2:
pass
except Exception as result:
# 捕获未知错误
pass
else:
# 没有异常时执行的代码
pass
finally:
# 无论是否有异常都会执行的代码
pass
示例:输入一个数字,用24除以这个数字
try:
num = int(raw_input('请输入一个整数:'))
result = 24 / num
print result
# 输入的不是数字
except ValueError:
print '请输入正确的整数'
# 0不能做除数
except ZeroDivisionError:
print '0不能做除数,请重新输入一个整数'
# 捕获未知错误
except Exception as result:
print '未知错误%s' % result
# 没有异常时执行的代码
else:
print 'successful'
# 无论是否有异常都会执行的代码
finally:
print '*' * 20
输入正确的整数
输入0
输入字母
5)异常的传递
异常的传递–当函数/方法执行出现异常,会将异常传递给函数/方法调用的一方,如果传递到主程序,一然后没有异常处理,程序才会终止,可以在主程序中增加异常捕获。而在主程序中调用其他函数,只要出现异常,都会传递到主程序的异常捕获中,这就不需要在代码中,增加大量异常捕获,能够保证代码的整洁
示例:
def demo1():
num = int(raw_input('请输入一个整数:'))
def demo2():
return demo1()
# 利用异常的传递性,在主程序中捕获异常
try:
print demo2()
except Exception as result:
print '未知错误%s' % result
输入字母
输入整数
示例:输入密码,密码小于8位,提示异常,密码大于8位,返回
def passwd():
num = raw_input('请输入密码:')
if len(num) >= 8:
return num
ex = Exception('请至少输入8位')
raise ex
try:
print passwd()
except:
print '请至少输入8位'
else:
print '设置成功'
密码少于8位
密码大于8位
2.模块
所有的python文件都可以是一个模块文件
可以在python文件中定义函数,类或者变量
在另一个文件中import filename导入这个文件
再用filename.函数名/filename.变量名调用这个函数或变量
1)示例1:
模块文件1内容:
title = 111
def demo():
print '我是%s' %title
class Dog(object):
pass
模块文件2内容:
title = 222
def demo():
print '我是%s' % title
class Cat(object):
pass
将模块文件1和2导入新文件
import test1
import test2
test1.demo()
test2.demo()
dog = test1.Dog()
print dog
cat = test2.Cat()
print cat
执行结果:
2)模块别名设定
导入模块时可以使用as设定模块的别名(大驼峰命名法)
示例:导入test1和test2
import test1 as LittleDog
import test2 as LittleCat
# 用别名调用函数
LittleDog.demo()
LittleCat.demo()
执行结果:
3)模块的命名
python的解释器在导入模块的时候,会:
1.搜索当前目录指定的模块文件,如果有就直接导入
2.如果没有,再搜索系统目录
注意:在开发时,给文件起名,不要和系统模块文件重名
4)test:_name_属性
_name_属性可以做到,测试模块的代码值在测试情况下被运行,而在导入的时候不会被运行
_name_是python的一个内置属性,记录着一个字符串
如果是被其他文件导入时,_name_就是模块名
如果是当前执行的程序,_name_就是_main_
在很多python文件中看到以下格式的代码
#导入模块
#定义全局变量
#定义类
#定义函数
#在代码下方
def main():
pass
if __name__ == '__main__'
main()
示例
模块文件:
# 全局变量,函数,类,直接执行的代码不是向外界提供的工具
def test():
print 'hello world'
if __name__ == '__main__':
print __name__
# 文件导入的时候,能够直接被执行的代码不需要被执行
print 'have a nice day'
test()
导入:
import test
执行结果:
3.文件
1)操作文件的函数/方法
在python中要操作文件需要记住一个函数,三个方法
open:打开文件并返回文件操作对象
read:将文件内容读取到内存
write:将指定内容写入文件
close:关闭文件
open函数负责打开文件并返回文件对象
read/write/close三个方法都需要通过文件对象来调用
read方法–读取文件
open函数的第一个参数是要打开的文件名(文件名区分大小写)
如果文件存在,返回文件操作对象
如果文件不存在,会抛出异常
read方法可以一次性读取并返回内存中的所以内容
close方法负责关闭文件
示例1:只读模式
# 打开文件
file = open('readme')
# 操作文件 读/写
# read方法:读取文件内容,一次性返回文件的所以内容
text = file.read()
print text
# 关闭文件
# close方法:负责关闭文件
file.close()
# 在开发中,会先编写打开和关闭的代码,如果不关闭文件会造成系统消耗,会影响后续对文件的操作
readme文件内容:
执行结果:
示例2:写入
‘w’:以写入的方式打开文件,如果文件存在,会覆盖文件内容
如果文件不存在,会建立文件并写入
# 以写入的方式打开文件,如果文件存在,会覆盖文件内容
# 如果文件不存在,会建立文件并写入
# 打开
file = open('readme','w')
# 写入
file.write('$#$#$#%$%')
# 关闭
file.close()
执行:
执行结果:
示例3:
‘a’:以写入的方式打开文件,如果文件存在,会追加到文件末尾
如果文件不存在,会建立文件并写入
# 以写入的方式打开文件,如果文件存在,会追加到文件末尾
# 如果文件不存在,会建立文件并写入
# 打开
file = open('readme','a')
# 写入
file.write('hello')
# 关闭
file.close()
执行:
执行结果:
2)文件指针
文件指针表示从那个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置
当执行read方法后,文件指针会移动到读取内容的末尾
示例1:
file = open('readme')
text = file.read()
print text
print '*' * 20
# 第一次读取文件的时候,文件指针移到了文件的末尾
# 再次调用不会读到任何内容
text = file.read()
print text
file.close()
执行结果:
示例2:
# 打开
file = open('readme')
# 读取
text = file.read()
print text
# 打印类型
print type(text)
# 打印长度
print len(text)
print '*' * 20
text = file.read()
print text
print len(text)
# 关闭
file.close()
执行结果:
3)按行读取文件
read方法默认会把文件的所有内容一次性读到内容
如果文件太大。对内存的占用会非常严重
readline方法:
readline方法可以一次性读取一行内容
方法执行后,会把文件指针移动到下一行,准备再次读取
示例:
# 读取大文件的正确姿势
file = open('readme')
while True:
text = file.readline()
# 如果文件指针到最后以后,就读不到内容了
if not text:
break
# 每读取一行,末尾都有一个\n
print text
执行结果:
4)复制
示例:
# 原文件以只读模式答开
file1 = open('readme')
# 目的文件以写的模式打开
file2 = open('readme_copy','w')
# 读取原文件内容
while True:
text = file1.readline()
if not text:
break
# 将读取到的内容写到目标文件
file2.write(text)
# 关闭文件
file1.close()
file2.close()
执行:
执行结果:
5)with关键字
关键字with不需要在访问文件后将其关闭,在这个程序中,
我们调用了open(),但没有调用close();你也可以调用open()和close来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句没有执行,文件将不会关闭,未妥善地关闭文件可能会导致数据丢失或受损,如果在程序中过早地调用close(),你会发现需要使用文件时它已经关闭(无法访问),
这会导致更多地错误,你并非在任何情况下都能轻松地确定关闭文件地恰当时机通过使用with结构,可让python去确定,你只管打开文件,并在需要时使用它,python会在合适的时候自动将其关闭
示例1:只读
with open('pi') as file_object:
text = file_object.read()
print text
pi文件内容:
执行结果:
示例2:按行读取
with open(name) as file:
for line in file:
print line
执行结果:
示例3:将第一行字符一个个输出
name = 'pi'
with open(name) as file:
text = file.readline()
for line in text:
print line
执行结果:
示例4:写入并覆盖原文件内容
name = 'pi'
with open(name,'w') as file:
file.write('hello python\n')
file.write('hello world\n')
执行:
执行结果:
示例5:写入并追加到原文件内容后
name = 'pi'
with open(name,'a') as file:
file.write('hello python\n')
file.write('hello world')
执行:
执行结果:
4.数据存储—json
很多程序都要求用户输入某种信息,
程序都把用户提供的信息存储在列表和字典等数据结构中,用户关闭程序时,你几乎总是要保存他们的信息;一种简单的方式是使用模块json来存储数据
(在python中使用j son的时候,主要也就是使用j son模块,json是以一种良好的格式来进行数据的交互)模块j son让你能够将简单的Python数据结构转存到文件中,国国并在程序再次运行时加载该文件中的数据,同有你还可以使用j son在Python程序之间分享数据,更重要的是,j son数据格式并非Python专用的,
这让你能够将以j son格式存储的数据与使用其他编程语言的人分享
注意: json(javascriptobject notation) 格式最初是为javascript开发的,但随后成了一种常见格式,被包括python在内的众多语言采用的有有有富春量
1)json.dump 添加内容
示例:
import json
number = [1, 2, 3, 4]
with open('numbers.json','w') as f_obj:
json.dump(number,f_obj)
执行:
执行结果:
2)json.load 加载内容
示例:
filename = 'numbers.json'
with open(filename) as f_obj:
# 我们用json.load加载存储在numbers.json中的内容
# 并将其存储在变量numbers中
numbers = json.load(f_obj)
print numbers
执行结果:
3)综合示例1:
import json
username = raw_input('请输入姓名:')
filename = 'username.json'
with open(filename,'a') as f_obj:
json.dump(username,f_obj)
print 'we are friends,%s' % username
执行结果:
综合示例2:
如果文件以前储存了用户,就显示
如果没有用户就提示用户输入用户名并储存它
import json
try:
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print numbers
except ValueError:
username = raw_input('请输入姓名:')
filename = 'numbers.json'
with open(filename, 'a') as f_obj:
json.dump(username, f_obj)
print '添加%s成功!' % username
执行结果: