python中的异常与模块与json、数据储存

一、异常

概念

在程序的开发中,如果对某些代码的执行不确定(程序的语法没有问题)

可以用try来捕获异常

格式

try:

       尝试执行的代码

except:

          出现错误的处理

try:
    num = int(raw_input('请输入整数:'))
except:
    print '输入正确的整数!'

练习

"""
1.提示用户输入一个整数
2.使用8除以用户输入的整数并且输出

"""
#当python解释器抛出异常时,最后一行的错误信息显示就是错误类型
try:
    num = int(raw_input('请输入整数:'))
    result = 8 / num
    print result
except ZeroDivisionError:
    print '零不能做除数'
except ValueError:
    print '你需要输入一个整数'
#错误预想
#1输入的不是整数
#2零不能做除数

如果出现未知的错误可以这样写

try:
    num = int(raw_input('请输入整数:'))
    result = 8 / num
    print result
except ZeroDivisionError:
    print '零不能做除数'
#捕获未知异常
#result:一个变量名称,随意起
except Exception as result:
    print '未知错误%s' % result
    

在开发的时候,要判断所有可能出现的错误,是有一定难度的

如果希望那个程序无论出现任何的错误,欧不会因为python解释器抛出异常而中止

可以再增加一个except Exception

完整的try结构

try:
    #尝试执行的代码
except: 错误类型1
except: 错误类型2 
。。。
except Exception as result:
else:
    #没有异常才会执行的代码
finally:
    #无论程序正确或者错误,都会执行的代码
try:
    num = int(raw_input('请输入整数:'))
    result = 8 / num
    print result
except ZeroDivisionError:
    print '零不能做除数'
except Exception as result:
    print '未知错误%s' % result
else:
    print '输入正确'
finally:
    print '*************'

输出结果

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/3.py
请输入整数:……
未知错误invalid literal for int() with base 10: '\xe2\x80\xa6\xe2\x80\xa6'
********************************************************************************************************************************************************************************************************************************************************************

Process finished with exit code 0

异常的传递

"""
异常的传递
当函数|方法执行出现异常,会将异常传递给函数|方法调用的一方
如果传递到主程序,依旧没有异常处理,程序才会终止,
可以在主程序中增加异常捕获,
而在主函数中调用的其他函数,只要出现异常
都会传递到主函数的异常
捕获中,这就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁

"""
def demo1():
    return int(raw_input('输入一个整数:'))
def demo2():
    return demo1()
#利用异常的传递性,在主程序中捕获异常

try:
    print demo2()
except Exception as result:
    print '未知错误 %s' % result
#判断用户输入的密码
1. <8位 错误
2. >= 8位 返回输入的密码
def input_passwd():
    #提示用户输入密码
    pwd = raw_input('输入密码')
#判断密码的长度>= 8 ,就返回用户的输入密码
    if  len(pwd) >= 8:
        return pwd
    #<8,主动抛出异常
    #print '主动抛出异常'
#1.创建异常对象(可以添加错误信息)
    ex = Exception('密码长度不够!')
    raise ex
#注意:之长处异常而不捕获异常,代码会出错
try:
    print input_passwd()
except Exception as result:
    print result
#县创建异常对象,再抛出异常,再在主函数中捕获异常

异常中自己写错误信息

断言

断言
"""
def func(num,div):
    assert (div != 0 ), "div 不能为0"
    return num / div
print func(10,0)

这样的结果显示:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/7.py
Traceback (most recent call last):
  File "/home/kiosk/PycharmProjects/python/day7/7.py", line 12, in <module>
    print func(10,0)
  File "/home/kiosk/PycharmProjects/python/day7/7.py", line 10, in func
    assert (div != 0 ), "div 不能为0"
AssertionError: div 不能为0

Process finished with exit code 1

二、模块

#使用as指定模块的别名(使用大驼峰命名法)
import mokuai1 as Yimodule
import mokuai2 as Ermodule
python的解释器在导入模块的时候,会:
1.搜索当前目录指定的模块文件,如果有就直接导入
2如果没有,再搜索系统目录
注意:在开发时,给文件起名,不要和系统的模块文件重名

"""
import random
rand = random.randint(10,20)
print rand

如果一样就会出现这样的报错

usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/模块/模块5.py
Traceback (most recent call last):
  File "/home/kiosk/PycharmProjects/python/day7/模块/模块5.py", line 14, in <module>
    rand = random.randint(10,20)
AttributeError: 'module' object has no attribute 'randint'

Process finished with exit code 1

__name__的属性
 

"""
__name__的属性
测试模块的代码只在测试情况下被运行,而在被导入时不会
__name__是python的一个内置属性,记录着一个字符串
如果是被其他文件导入时,__name__就是__main__
"""
#全局变量,函数,类,直接执行的代码不是向外界提供的工具

def say():
    print 'hello'
print 'flash'
#如果直接执行在模块中输出,得到的是__main__
print __name__
#文件被导入的时候,能够直接被执行的代码 不需要被执行
if __name__ == '__main__':
    print __name__
    print '我 开发的程序'
say()

其运行的结果为

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/模块/mk.py
flash
__main__
__main__
我 开发的程序
hello

Process finished with exit code 0

在python中常看到的代码格式

python中常看到的代码格式
# 导入模块
# 定义全部变量
# 定义类

# 在代码的下方

    def main():
        pass
    if __name__ == '__main__'
        main()
        
# 在导入的.py文件中,输出的时 文件名        
        

三、文件

1 读取

"""
操作文件的函数/方法
在python中要操作文件需要记住的1个函数和3个方法
	#python中一切皆对象
	open  :打开文件,并且返回文件操作对象
	read  :将文件内容读取到内存
	write :将指定内容写入文件
	close :关闭文件
open函数负责打开文件,宾且返回文件对象
read/write/close三个方法都需要通过文件对象来调用


read方法--读取文件
open函数的第一个参数是要打开的文件名(文件名区分大小写)
	如果文件存在,返回文件操作对象
	如果文件不存在,会抛出异常
read方法可以一次性读入并返回文件的所有内容
close方法负责关闭文件

"""
# 如果忘记关闭文件,会造成系统消耗,而且会影响到后续对文件的访问
# 1.打开文件
file = open('REDME')

# 2.操作文件 读/写
# read方法:读取文件内容(一次性返回文件的所有内容)
text = file.read()
print text

# 3.关闭文件
# close方法:负责关闭文件
file.close()

# 在开发中,通常会先编写打开和关闭的代码


新建立一个文本

一定注意不是pythonfile文件

可得结果 为文本文档的内容

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/文件/1.py
xixixixixix


Process finished with exit code 0

文件指针

# _*_ coding:utf-8 _*_
"""
file:2.py
date:2018-07-24 2:33 PM
author: FATRAT 
desc:
文件指针:
文件指针标记从哪个位置开始读取数据
第一次打开文件时,通常文件之真会只想文件的开始位置   
当执行了read方法后,文件指针会移动到读取内容的末尾

"""
file = open('read')
text = file.read()
print text

print  '#' * 50
#第一次读取的时候,文件指针移动到了文件的末尾
#再次调用不会读取到任何内容

text = file.read()
file.close()

结果为

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/文件/2.py
xixixixixix
lalala
gagaga
dafasfasaad
sdfwefasdfas
d
##################################################

Process finished with exit code 0

练习1

# _*_ coding:utf-8 _*_
"""
file:3.py
date:2018-07-24 2:36 PM
author: FATRAT 
desc:
"""
file = open('read') #可以读取目录中的文件例如:/home/file
text = file.read()
print text
#打印输入内容的长度
print type(text)
print len(text)


print  '#' * 50
file.close()

结果为

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/文件/3.py
xixixixixix
lalala
gagaga
dafasfasaad
sdfwefasdfas
d
<type 'str'>
52
##################################################

Process finished with exit code 0

读取系统中的文件

# _*_ coding:utf-8 _*_
"""
file:2.py
date:2018-07-24 2:33 PM
author: FATRAT 
des:
文件指针:
文件指针标记从哪个位置开始读取数据
第一次打开文件时,通常文件之真会只想文件的开始位置
当执行了read方法后,文件指针会移动到读取内容的末尾

"""
file = open('/mnt/python/day07/文件/REDME')
text = file.read()
print text

print  '#' * 50
#第一次读取的时候,文件指针移动到了文件的末尾
#再次调用不会读取到任何内容

text = file.read()
file.close()

结果为

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/文件/2.py
hello python
hello world
hello hello
##################################################

Process finished with exit code 0

2 写

# _*_ coding:utf-8 _*_
"""
file:4.py
date:2018-07-24 2:57 PM
author: FATRAT 
desc:
以写的方式打开文件,如果文件存在会覆盖原内容
如果文件不存在会创建一个新的文件
"""

#1.打开文件

file = open('read','w')

#2.写入文件
file.write('westos ')
#3.关闭文件
file.close()

2、

# _*_ coding:utf-8 _*_
"""
file:5.py
date:2018-07-24 3:00 PM
author: FATRAT 
desc:
以写的方式打开文件,不会覆盖源文件 会在源文件末尾添加

"""
#1.打开文件

file = open('read','a')

#2.写入文件
file.write('bilibili comp ')


#3.关闭文件
file.close()

file = open('read')
text = file.read()
print text
file.close()

通过关闭后再此读取可以看到实验的结果

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day7/文件/5.py
westos bilibili comp bilibili comp bilibili comp bilibili comp 

Process finished with exit code 0

添加成功哦

3、读取大文件

# _*_ coding:utf-8 _*_
"""
file:6.py
date:2018-07-24 3:09 PM
author: FATRAT 
desc:
如何读取大文件
read方法默认会把文件的所有内容一次性读到内存中
如果文件太大,对内存的占用率鞭打
而使用readline方法:
一次只读取一行内容
方法执行后,会把文件指针移动到下一行,尊卑再次读取


"""
file = open('read')
#死循环是为了在读取文件时不知道文件有多少行

while True:
    text = file.readline()
#如果文件指针到文件的最后一行,就没有内容可读了
    if not text:
        break
        #每读取一行,末尾都有一个\n
    print text
file.close()

文件的复制

# _*_ coding:utf-8 _*_
"""
file:7.py
date:2018-07-24 3:25 PM
author: FATRAT 
desc:
文件的复制
"""
#打开文件
file_read = open('read')
#源文件以只读的方式打开
#目标文件以写的方式打开
file_write = open('cp_read','w')
#从源文件中读取内容
text =file_read.read()
#将读取到的内容写道目标文件中
file_write.write(text)

#关闭文件
file_read.close()
file_write.close()

大文件的复制

# _*_ coding:utf-8 _*_
"""
file:8.py
date:2018-07-24 3:35 PM
author: FATRAT 
desc:
大文件的逐行复制

"""
file_read = open('read')
file_write = open('cp_read','w')
while True:
    text = file_read.readline()
    if not text:
        break
    file_write.write(text)
file_read.close()
file_write.close()

第二种查看文件的方法

with

关键字with在不需要访问文件后将其关闭,在这个程序中,
我们调用了open(),但没有调用close();你也可以调用open()和close来打开
和关闭文件,但这样做时,如果程序存在bug,导致close()语句没有执行,
文件将不会关闭,未妥善地关闭文件可能会导致数据丢失或受损,
如果在程序中过早地调用close(),
你会发现需要使用文件时它已经关闭(无法访问),
这会导致更多地错误,你并非在任何情况下都能轻松地确定关闭文件地恰当时机
通过使用with结构,可让python去确定,
你只管打开文件,并在需要时使用它,
python会在合适的时候自动将其关闭

# _*_ coding:utf-8 _*_
"""
file:1.py
date:2018-07-24 4:02 PM
author: FATRAT 
desc:
"""
with open('po') as file_object:
    contents = file_object.read()
    print contents
    

2.

# _*_ coding:utf-8 _*_
"""
file:2.py
date:2018-07-24 4:16 PM
author: FATRAT 
desc:
"""
filename = 'po'
with open(filename) as file_object:
    for line in file_object:
        print line

3.添加

# _*_ coding:utf-8 _*_
"""
file:3.py
date:2018-07-24 4:17 PM
author: FATRAT 
desc:
"""
# _*_ coding:utf-8 _*_

filename = 'po'
with open(filename,'w') as file_object:
    file_object.write('i gogogog\n')
    file_object.write('xixixixi')

三、数据储存

# _*_ coding:utf-8 _*_
"""
file:1.py
date:2018-07-24 4:33 PM
author: FATRAT 
desc:
很多程序都要求用户输入某种信息,
程序都把用户提供的信息存储在列表和字典等数据结构中,
用户关闭程序时,你几乎总是要保存他们的信息:
一种简单的方式是使用模块json来存储数据
(在python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互)
模块json让你能够将简单的Python数据结构转存到文件中,
并在程序再次运行时加载该文件中的数据,
你还可以使用json在Python程序之间分享数据,
更重要的是,json数据格式并非Python专用的,
这让你能够将以json格式存储的数据与使用其他编程语言的人分享

注意:json(javascriptObject notation)格式最初是为javascript开发的,但随后成了一种常见格式,
被包括python在内的众多语言采用


"""
import json
number = [1,2,3,4]
with open('numbers.json','w') as f_obj:
    #我们使用函数json.dump()将数字列表储存到列表中
    json.dump(number,f_obj)
# _*_ coding:utf-8 _*_
"""
file:2.py
date:2018-07-24 4:34 PM
author: FATRAT 
desc:
"""
import json
filename = 'numbers.json'
with open(filename) as f_obj:
    #函数使用的load加载存储再numbers.json中的信息
    #并将其存储到变量numbers
    numbers = json.load(f_obj)
print numbers

json的列表使用

存储名字

# _*_ coding:utf-8 _*_
"""
file:3.py
date:2018-07-24 4:46 PM
author: FATRAT 
desc:
"""
import json
username = raw_input('what is your name ?')
filename = 'username.json'
with open(filename,'a') as f_obj:
    json.dump(username,f_obj)
    print 'We will remeber you when you come back, %s' % username

读取名字

 # _*_ coding:utf-8 _*_
"""
file:4.py
date:2018-07-24 4:48 PM
author: FATRAT 
desc:读取名字
"""
import json

filename = "username.json"
with open(filename) as f_obj:
    username = json.load(f_obj)
    print "Welcome back, %s" % username

练习题

# _*_ coding:utf-8 _*_
"""
file: 05.py
date: 2018-07-24 4:53 PM
author: westos-dd
desc:
题目
如果以前存储了用户,就显示
否则,就提示用户输入用户名并存储它

"""
import json
filename = "username.json"
try:
    with open(filename) as f_obj:
        username = json.load(f_obj)
except ValueError:
    username = raw_input("What is you name? ")
    with open(filename,"w") as f_obj:
        json.dump(username,f_obj)
        print "We'll remember you when you come back %s" % username
#依赖于try代码块成功执行的代码都应放到else代码块中:
else:
    print "Welcome back %s " % username

猜你喜欢

转载自blog.csdn.net/a313434458/article/details/81178537