python_06_异常输出,模块,文件的读写及数据存储json

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

执行结果:
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值