python之异常、模块、文件、数据存储

1.异常

概述:

在程序开发中,如果某些代码的执行不确定(程序的语法完全正确),可以增加try 来捕获异常

(1)基本语法格式:

   try:

       要执行的代码

   except:

       出现错误的处理

 

代码

try:

    num = int(raw_input('请输入一个整数:'))

except:

    print '请输入正确的整数'

# 无论输入是否正确,程序都会正确的执行

print '*' * 50

 

执行结果:

 

例1

需求:

1.提示用户输入一个整数

2.使用8除以用户输入的整数并输出

 

预知错误类型:

1. 输入的不是整数

2. 0 不能作为除数

 

注意:当python解释器抛出异常时,最后一行错误信息的第一个单词就是错误类型

 

代码

try:

    num = int(raw_input('请输入一个整数:'))

    result = 8 / num

    print result

except ZeroDivisionError:

    print '除数错误  0不能作为除数'

except ValueError:

    print '请输入一个正确的整数'

执行结果:

 

(2)捕获未知异常:

 在开发时,要判断所有可能出现的错误,是有一定难度的,若希望程序无论出现任何错误 都不会因为python解释器

 抛出的异常而终止,可以再增加一个except

 

代码

try:

    num = int(raw_input('请输入一个整数:'))

    result = 8 / num

    print result

except ValueError:

    print '请输入一个正确的整数'

# 当某些错误我们预知不到的时候

# 此时可以利用python解释器来捕获未知异常

# result为一个变量名,可以随意取

except Exception as result:

    print '未知错误 %s' % result

执行结果:

 

(3)完整的语法格式

try:

   #想要执行的代码

   pass

except:  错误类型1

   pass

except:  错误类型2

   pass

except Exception as 变量名:

   #未知异常

   pass

else:

   #没有异常时才会执行的代码

   pass

finally:

   #无论是否有异常都会执行的代码

   pass

 

代码

try:

    num = int(raw_input('请输入一个整数:'))

    result = 8 / num

    print result

except ValueError:

    print '请输入一个正确的整数'

# 当某些错误我们预知不到的时候

# 此时可以利用python解释器来捕获未知异常

# result为一个变量名,可以随意取

except Exception as result:

    print '未知错误 %s' % result

# 只有在没有异常的时候,才会执行

else:

    print '尝试成功'

# 无论是否有异常,都会执行

finally:

    print '*************'

执行结果:

 

(4)异常的传递

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

 

代码

def demo1():

    return int(raw_input('请输入一个整数:'))

# 异常具有传递性

#print demo1()

def demo2():

    return demo1()

# 利用异常的传递性在主程序中捕获异常

try:

    print demo2()

except Exception as result:

    print '未知错误 %s' % result

执行结果:

 

实例:

需求:

判断用户输入的密码

1. < 8 错误

2. >= 8 返回输入的密码

 

先创建异常对象 再抛出异常 在主函数中捕获异常

len() 判断字符长度的函数

 

代码

def input_passwd():

    # 提示用户输入密码

    passwd = raw_input('请输入密码:')

    # 判断密码长度如果大于8就后返回输入的密码

    if len(passwd) >= 8:

        return passwd

    # 如果密码长度小于8就主动抛出异常

    # print '主动抛出异常'

    # 1.创建异常对象(可以添加错误信息)

    ex = Exception('密码太短了')

    raise ex

# 注意:只抛出异常而不捕获异常,代码会报错

# 2.捕获异常

try:

    print input_passwd()

except Exception as result:

    print result

执行结果:

 

2.断言: 

提前预言 让人更好的知道错误的原因

 

代码

def func(num,div):

    assert (div != 0),'div不能为0'

    return num / div

print func(10,0)

执行结果:

 

3.模块

(1)建立一个test1 :

代码

title = '模块1'

# 定义函数

def say_hello():

    print '我是 %s' % title

# 定义类

class Cat(object):

    pass

(2)再建立一个test2 :

代码

title = '模块2'

def say_hello():

    print '我是 %s' % title

class Dog(object):

    pass

(3)重新建立文件

代码1

import test1

import test2

test1.say_hello()

test2.say_hello()

cat = test1.Cat()

print cat

dog = test2.Dog()

print dog

执行结果:

 

代码2

# 使用as指定模块的别名(大驼峰命名法)

import test1 as CatModule

import test2 as DogModule

CatModule.say_hello()

DogModule.say_hello()

cat = CatModule.Cat()

print cat

dog = DogModule.Dog()

print dog

执行结果:

 

(4)python的解释器在导入模块的时候,会:

1.搜索当前目录指定的模块文件,如果有就直接导入

2.如果没有,再搜索系统目录

 

注意:在开发时 给文件起名 不要和系统模块文件重名

如果出现重名,再导入模块的时候会报错

 

代码

# 导入random模块

import random

# 生成0-10的随机数

rand = random.randint(0,10)

print rand

执行结果:

 

(5)__name__ 属性

可以做到 测试模块的代码只是在测试的情况下被运行,而在被导入的时候不会被执行

__name__是python的一个内置属性     __name__记录着一个字符串

 

注意:如果是被其他文件导入时 __name__就是模块名

           如果时被当前文件执行的程序 __name__就是__main__

 

代码1:

1.在test3中

代码

def say_hello():

    print 'hello word!'

#print 'have a nice day'

#say_hello()

# 直接在模块中输入 得到的是__main__

print __name__

执行结果:

 

2.在003中

# 在导入的文件中 输出的是 文件名

import test3

执行结果:

 

在test3中

代码2:

# 全局变量 函数 类 直接执行的代码不是向外界提供的工具

def say_hello():

    print 'hello word!'

#print 'have a nice day'

#say_hello()

# 直接在模块中输入 得到的是__main__

# print __name__

if __name__ == '__main__':

    print __name__

    print 'lily 开发的程序'

    say_hello()

执行结果:

 

在003中:

代码

# 在导入的文件中 输出的是 文件名

import test3

执行结果:

 

 

4.文件

1.操作文件的函数/方法

在python中要操作文件需要记住1个函数和3个方法

#python中一切皆对象

(1).  open函数

负责打开文件 并返回文件对象

语法格式:

变量名 = open('文件名')

注意:   如果文件存在 返回文件操作对象, 如果文件不存在 会影响后续文件,文件名区分大小写

 

(2). 三个方法

都需要通过文件对象来调用

read         将文件内容读取到内

write         将指定内容写入文件

close        关闭文件

 

(1). 1   read方法

可以一次性读入并返回文件的所有内容

格式:

变量名=文件名.read()

 

先建立一个名为README的文件(点击鼠标右键 ---> New ---> File)

并在README文件中写入:hello python

 

代码

# 1. 打开文件

file = open('README')

# 2. 操作文件  读/写

# read方法 读取文件内容并打印文件内容(一次性返回文件的所有内容)

text = file.read()

print text

# 3. 关闭文件

# close方法 负责关闭文件

file.close()

# 在开发中 通常会先编写打开文件和关闭文件的代码 再操作文件

执行结果:

 

文件指针:

文件指针标记从那个位置开始读取数据,第一次打开文件时 通常文件指针会指向文件开始的位置,当执行了read方法后 文件指针会移动到读取内容的末尾

 

再在README文件中写入:my love

 

代码1

# 1. 打开文件

file = open('README')

# 2. 操作文件  读/写

# read方法 读取文件内容(一次性返回文件的所有内容)

text = file.read()

print text

print '*' * 50

# 第一次读取的时候 文件指针移动到了文件的末尾

# 再次读取的时候 便读取不到文件内容

text = file.read()

print text

# 3. 关闭文件

# close方法 负责关闭文件

file.close()

执行结果:

 

代码2

# 1. 打开文件

# 文件名也可以用绝对路径的方式

#file = open('/home/kiosk/python07')

file = open('README')

# 2. 操作文件  读/写

# read方法 读取文件内容(一次性返回文件的所有内容)

text = file.read()

print text

# 打印输出内容的类型和长度

print type(text)

print len(text)

print '*' * 50

text = file.read()

print text

print len(text)

# 3. 关闭文件

# close方法 负责关闭文件

file.close()

执行结果:

 

(1) .2   readline方法

read方法默认会把文件的所有内容一次性读到内存,如果文件太大,对内存的占用会非常严重

readline方法:

   可以一次性读取一行内容, 方法执行后,会把文件指针移动到下一行,准备再次读取

 

格式:

变量名 = 文件名.readline()

 

代码

# 读取大文件的正确姿势

file = open('README')

# 由于未知文件的行数 故写为死循环

while True:

    text = file.readline()

    # 如果文件指针到文件的最后一行 便跳出循环

    if not text:

        break

    # 每读取一行 末尾便会自动加上\n换行

    print text

file.close()

执行结果:

 

(2)write方法

将指定内容写入文件

格式:

变量名 = open('文件名','w')   # w 表示 覆盖

变量名 = open('文件名','a')   # a 表示 追加

 

代码1

# 1. 打开文件

# w 会覆盖原文件内容

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

# 2. 写入文件

file.write('westos')

# 3. 关闭文件

file.close()

执行结果:

README文件中的内容变为 westos 将原来文件中的内容覆盖

 

代码2

# 1. 打开文件

# a 表示追加,不会覆盖原文件内容

# 如果该文件存在,文件指针会放在文件的末尾

# 如果文件不存在,会自动创建文件并写入

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

# 2. 写入文件

file.write('linux')

# 3. 关闭文件

file.close()

执行结果:

在README文件中的westos后边添加linux

 

 

实例

需求:复制文件

 

代码1(read方法)

# 1.打开文件

# 源文件以只读方式打开

file_read = open('README')

# 目标文件以写的方式打开

file_write = open('READ_COPY','w')

# 从源文件中读取内容

text = file_read.read()

# 将读取的内容写到目标文件中

file_write.write(text)

# 3.关闭文件

file_read.close()

file_write.close()

执行结果:

自动创建名为READ_COPY的文件

 

 

代码2(readline方法)

再在README文件中添加一行

写入  nice day

# 1.打开文件

# 源文件以只读方式打开

file_read = open('README')

# 目标文件以写的方式打开

file_write = open('READ_COPY1','w')

# 2.读写

while True:

    text = file_read.readline()

    # 如果文件指针到文件的最后一行 便跳出循环

    if not text:

        break

    # 每读取一行便将读取的内容写到目标文件中

    file_write.write(text)

# 3.关闭文件

file_read.close()

file_write.close()

执行结果:

 

(3)close方法

用于关闭文件

格式:

文件名.close()  

 

 

2.关键字with

概述:

     在不需要访问文件后将其关闭 ,在这个程序中我们调用了open()函数 但没有调用close(),你可以调用open()和close() 来打开和关闭文件,但这样做时,如果程序存在bug,会导致close()语句没执行,文件将不会关闭,未妥善的关闭文件可能会导致数据的丢失或受损,如果在程序中过早的调用close(),你会发现需要使用文件时,它已经关闭(无法访问),这样会导致很多的错误。

     你并非在任何情况下都能轻松的确定关闭文件通过使用with结构,可让python去确定,你只需要打开文件,并在需要的时候使用它,python会在和时的时候自动将其关闭

 

先创建一个名为pi_file的文件

并在pi_file文件中写入 3.1415926

代码1

# 好处:打开文件后无需关闭文件

with open('pi_file') as file_object:

    contents = file_object.read()

    print contents

执行结果:

 

代码2

filename = 'pi_file'

with open(filename) as file_object:

    # 按行打印 中间会自动出现换行符

    for line in file_object:

        print line

执行结果:

 

代码3

filename = 'pi_file'

# 读取文件

with open(filename) as file_object:

    lines = file_object.readline()

#for line in lines:

    # 只会打印第一行

    print lines

执行结果:

 

代码4

filename = 'pi_file'

# 写入文件

# 如果是a 便会添加到文件内容的末尾

with open(filename,'w') as file_object:

    file_object.write('I love me\n')

    file_object.write('I love you')

执行结果:

 

5.数据存储

概述:

     很多程序都要求用户输入某种信息,程序都把用户提供的信息存储在列表和字典等数据结构中,用户关闭程序时,你几乎总是要保存他们的信息:,一种简单的方式是使用json模块来存储数据(在python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互),json模块让你能够将简单的python数据转存到文件中,并在程序再次运行时加载该文件中的数据,你还可以使用json在python程序之间分享数据,更重要的是json数据个格式存储的数据与使用其他编程语言的人分享

注意:

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

 

代码1

# 导入 json

import json

number = [1,3,5]

# 以写的方式打开number.json文件

with open('number.json','w') as w_obj:

    # 函数json.dump 表示将number写入w_obj

    json.dump(number,w_obj)

执行结果:

 

代码2

# 导入json

import json

filename = 'number.json'

# 以只读的方式打开filename文件

with open(filename) as w_obj:

    # 函数json.load 表示加载存储在numbers.json中的信息

    # 并将其存储到变量numbers中

    numbers = json.load(w_obj)

print numbers

执行结果:

 

代码3

import json

username = raw_input('what is your name')

filename = 'username.json'

# w会覆盖  a表示追加

with open(filename,'a') as w_obj:

    # 将username写入w_obj

    json.dump(username,w_obj)

    print 'we will remember you forever %s' % username

执行结果:

 

代码4

# 导入json

import json

filename = 'username.json'

# 以读的方式打开文件

with open(filename) as w_obj:

    username = json.load(w_obj)

    print 'welcome back %s' % username

执行结果:

 

猜你喜欢

转载自blog.csdn.net/love_sunshine_999/article/details/81193623
今日推荐