#异常
如果没有预判错误,出现错误输入就会终止程序,很不方便,举例如下:
<1>In [1]: num = int(raw_input('请输入一个整数:'))
请输入一个整数:1
<2>In [2]: num = int(raw_input('请输入一个整数:'))
请输入一个整数:a
ValueError Traceback (most recent call last)
in ()
----> 1 num = int(raw_input('请输入一个整数:'))
ValueError: invalid literal for int() with base 10: 'a'
于是引入“异常”
# _*_ coding:utf-8 _*_
"""
file: -01.py
date: -07-24 7:39 PM
author: ting
desc:
程序开发中,如果对某些代码的执行不确定(程序的语法完全正确),可以增加try来捕获异常
优点:不会终止程序,也不会影响后续程序的执行
语法结构:
try:
尝试执行的代码
except:
出现错误的处理
"""
try:
num = int(raw_input('请输入一个整数:'))
except:
print '请输入正确的整数:'
# 这行代码依旧可以执行
print '-'*60
# _*_ coding:utf-8 _*_
"""
file: -02.py
date: -07-24 7:53 PM
author: ting
desc:
当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
需求:
1.提示用户输入一个整数
2.使用10除以用户输入的整数并且输出
"""
try:
num = int(raw_input('请输入一个整数:'))
result = 10 / num
print '得到的结果为:' ,
print result
# 输入的不是数字
# 0不能做除数
except ValueError:
print '请输入正确的整数:'
except ZeroDivisionError:
print '输入错误,0不能做除数'
# _*_ coding:utf-8 _*_
"""
file:-03.py
date: 2018-07-上午1:52
author:ting
desc:
捕获未知错误:
在开发的时候,要判断所有可能出现的错误,是有一定难度的
如果希望程序无论出现什么错误,都不会因为python解释器抛出异常而终止,可以再增加一个except
"""
try:
num = int(raw_input('请输入一个整数:'))
result = 10 / num
print result
# result 这是一个变量,任何字符都可以代替,但是不能与关键字重名
except Exception as result:
print '未知错误 %s' % result
# _*_ coding:utf-8 _*_
"""
file:-04.py
date: 2018-07-上午2:04
author:ting
desc:
try的完整语法结构:
try:
# 尝试执行的代码
pass
except: 错误类型1
pass
except: 错误类型2
pass
...
except Exception as result:
pass
else:
# 没有异常才会执行此代码
pass
finally:
# 无论是否有异常,都会执行此代码
pass
"""
try:
num = int(raw_input('请输入一个整数:'))
result = 10 / num
print result
except Exception as result:
print '未知错误 %s' % result
else:
print '尝试成功~~'
finally:
print '**********************************************'
# _*_ coding:utf-8 _*_
"""
file:-05.py
date: 2018-07-上午2:20
author:ting
desc:
"""
def demo1():
return int(raw_input('请输入一个整数:'))
print demo1()
# 查看报错信息可知,错误会传递,第十行的错误传递给了第十一行
# _*_ coding:utf-8 _*_
"""
file:-06.py
date: 2018-07-上午2:23
author:ting
desc:
异常的传递:
当 函数/方法 执行出现异常,会将异常传递给 函数/方法 调用的一方
如果传递到主程序,依旧没有异常处理,程序才会终止,可以在主程序中增加
异常捕获,而在主程序中调用其他函数,只要出现异常,都会传递到主函数的异常捕
获中,这就不需要在代码中增加大量的异常捕获,也能够保证代码的整洁
"""
def demo1():
return int(raw_input('请输入一个整数:'))
def demo2():
return demo1()
# 利用异常的传递性,在主程序中捕获异常
try:
print demo2()
except Exception as result:
print '未知错误 %s' % result
# _*_ coding:utf-8 _*_
"""
file:练习.py
date: 2018-07-上午2:33
author:ting
desc:
判断用户输入的密码:
1. <= 8 报错
2. >= 8 返回输入的密码
"""
def passwd():
# 提示用户输入密码
passwd = raw_input('请输入您的密码:')
# 判度密码的长度是否大于等于8
if len(passwd) >= 8:
return passwd
# 如果 < 8,报错
print '您的输入有错误'
# 创建异常对象(可以添加错误信息)
ex = Exception('密码长度不够')
raise ex
# 注意: 只抛出异常而不捕获异常,代码会报错
try:
print passwd()
except Exception as result:
print result
# 先创建异常对象,再抛出异常,再在主函数中捕获异常
# _*_ coding:utf-8 _*_
"""
file:断言-07.py
date: 2018-07-上午3:47
author:ting
desc:
断言:可以理解为提前预言,让人更好地知道错误原因
"""
def func(num,div):
# 加上此代码后,报错信息就会显示为自定义的报错信息,更方便看懂报错信息
assert (div != 0),'div不能为0'
return num/div
print func(4,0)
# _*_ coding:utf-8 _*_
"""
file:test-1.py
date: 2018-07-上午3:08
author:ting
desc:
"""
title = '模块1'
# 函数
def say_hello():
print '我是 %s' % title
# 类
class Cat(object):
pass
test2
# _*_ coding:utf-8 _*_
"""
file:test-2.py
date: 2018-07-上午3:10
author:ting
desc:
"""
title = '模块2'
# 函数
def say_hi():
print '我是 %s' %title
# 类
class Dog(object):
pass
导入1
# _*_ coding:utf-8 _*_
"""
file:导入-1.py
date: 2018-07-上午3:13
author:ting
desc:
"""
# 在导入模块时,每个导入应独占一行
import test1
import test2
# 调用函数
test1.say_hello()
test2.say_hi()
# 创建对象
dog = test2.Dog
print dog
cat = test1.Cat
print cat
导入2
# _*_ coding:utf-8 _*_
"""
file:导入-2.py
date: 2018-07-上午3:24
author:ting
desc:
如果需要导入的模块文件名太长,可以用以下方法导入
"""
# 使用as指定模块的别名用大驼峰命名法
import test1 as CatModule
import test2 as DogModule
DogModule.say_hi()
CatModule.say_hello()
dog = DogModule.Dog()
print dog
cat = CatModule.Cat()
print cat
导入3
# _*_ coding:utf-8 _*_
"""
file:导入-3.py
date: 2018-07-上午3:31
author:ting
desc:
"""
from test1 import Cat
# 当导入两个模块文件时,谁在前就导入谁
from test2 import say_hi
# from test1 import say_hello
# 想用此方法导入两个模块文件时,第二个导入可以用以下方法导入
from test1 import say_hello as test1_say_hello
say_hi()
test1_say_hello()
mimi = Cat()
导入4
# _*_ coding:utf-8 _*_
"""
file:导入-4.py
date: 2018-07-上午3:41
author:ting
desc:
python的解释器在导入模块的时候,会
1.搜索当前目录指定的模块文件,如果有就直接导入
2.如果没有,再搜索系统目录
注意:在开发时,给文件起名,不要和系统模块文件重名
"""
import random
rand = random.randint(0,10)
print rand
test
# _*_ coding:utf-8 _*_
"""
file:test.py
date: 2018-07-上午5:51
author:ting
desc:
"""
# 全局变量,函数,类,直接执行的代码不是向外界提供的工具
def say_hello():
print 'hello python~~'
print 'nice to meet you~~'
say_hello()
导入
# _*_ coding:utf-8 _*_
"""
file:-01.py
date: 2018-07-上午5:56
author:ting
desc:
在很多python文件中会看到以下格式的代码
1.导入模块
2.定义全部变量
3.定义类
4.定义函数
# 在代码的下方
def main():
pass
if __name__ == '__mian__'
main()
上述格式的代码给人感觉比较专业
"""
# 导入的时候什么都没干,却直接执行了原模块文件中的代码
import test
test1111 改进
# _*_ coding:utf-8 _*_
"""
file:test改进.py
date: 2018-07-上午6:04
author:ting
desc:
print __name__
这句代码输出的是 __main__
__name__属性:
__name__属性可以做到
测试模块的代码只在测试情况下被运行,而在被导入时不运行
__name__是python中的一个内置属性,记录着一个字符串
如果是被其他文件导入时,__name__就是模块名
如果是当前执行的程序,__name__就是__main__
"""
# 全局变量,函数,类,直接执行的代码不是向外界提供的工具
def say_hello():
print 'hello python~~'
# print 'nice to meet you~~'
# 如果想要文件被导入的时候,能够直接被执行的代码不需要被执行,可以用以下代码来进行控制
if __name__ == '__main__':
print __name__
# print 'you are very friendly'
# say_hello()
导入
# _*_ coding:utf-8 _*_
"""
file:-01.py
date: 2018-07-上午5:56
author:ting
desc:
在很多python文件中会看到以下格式的代码
1.导入模块
2.定义全部变量
3.定义类
4.定义函数
# 在代码的下方
def main():
pass
if __name__ == '__mian__'
main()
上述格式的代码给人感觉比较专业
"""
# 导入的时候什么都没干,却直接执行了原模块文件中的代码
import test1111
README文件
westos
hello
nihao
say hi
linux
happy
# _*_ coding:utf-8 _*_
"""
file:-01.py
date: 2018-07-上午6:27
author:ting
desc:
操作文件的函数(方法)
在python中要操作文件需要记住 1个函数,3个方法
# python中一切皆对象
open : 打开文件,并且返回文件操作对象
read : 将文件内容读取到内存
write: 将指定内容写入文件
close:关闭文件
open函数负责打开文件,并且返回文件对象
read/write/close这三个方法都需要通过文件对象来调用
read方法(读取文件):一次性读入并返回文件的所有内容
open函数的第一个参数是要打开的文件名(文件名区分大小写)
如果文件存在,返回文件操作对象
如果文件不存在,会抛出异常
close方法负责关闭文件
在开发中,通常会先编写打开和关闭的代码
"""
# 打开文件
file = open('README')
# 操作文件 读/写
text = file.read()
print text
# 关闭文件
file.close()
# 如果忘记关闭文件,会造成系统消耗,而且会影响后续文件的读取
# _*_ coding:utf-8 _*_
"""
file:-02.py
date: 2018-07-上午6:48
author:ting
desc:
文件指针:
文件指针标记从哪个位置开始读取数据
当第一次打开文件时,通常文件指针会指向文件的开始位置
当执行了read方法后,文件指针会移动到读取内容的末尾,不会再继续移动到文件的开始
"""
# 打开文件
file = open('README')
# 操作文件
text = file.read()
print text
# 打印输入内容的长度
print type(text)
print len(text)
print '*'*60
# 这里的代码不会被读取也不会被执行
text = file.read()
print text
print len(text)
# 关闭文件
file.close()
# _*_ coding:utf-8 _*_
"""
file:读文件-03.py
date: 2018-07-上午7:19
author:ting
desc:
读取大文件的方法(内容的多少未知)
按行读取文件:
read方法默认会把文件的所有内容一次性读取到内存
如果文件太大,对内存的占用会非常严重
readline方法:
readline方法可以一次性读取一行内容
方法执行后,会把文件指针移动到下一行,准备再次读取
"""
# 打开文件
file = open('README')
# 读取文件
# 写成死循环是因为不知道读取的文件有多少行
while True:
text = file.readline()
# 如果文件指针到文件的最后一行,那么就读不到内容了
if not text:
break
# 每读取一行,末尾都会自动添加一个 \n
print text
# 关闭文件
file.close()
# _*_ coding:utf-8 _*_
"""
file:写文件-01.py
date: 2018-07-上午7:04
author:ting
desc:
写文件是通过改变文件指针的位置,来写入内容
打开文件的方式:
name = open('文件名','访问方式')
"""
# 打开文件
# 'w'方式写入的内容只会覆盖原文件内容
file = open('README','w')
# 写入文件
file.write('westos')
# 关闭文件
file.close()
README文件
westos
# _*_ coding:utf-8 _*_
"""
file:写文件-追加-02.py
date: 2018-07-上午7:09
author:ting
desc:
以追加的方式打开文件
如果文件存在,文件指针会放在文件的末尾
如果文件不存在,创建文件并写入
"""
# 打开文件
file = open('README','a')
# 写入文件
file.write('hello')
# 关闭文件
file.close()
README文件
westoshello
####复制文件
# _*_ coding:utf-8 _*_
"""
file:复制文件-01.py
date: 2018-07-上午7:35
author:ting
desc:
以读取小文件的方式实现
"""
# 打开文件
# 源文件以读的方式打开
file_read = open('README')
# 目标文件以写的方式打开
file_write = open('README_COPY','w')
# 从源文件中读取文件
text = file_read.read()
# 将读取到的内容写入目标文件
file_write.write(text)
# 关闭文件
file_read.close()
file_write.close()
# _*_ coding:utf-8 _*_
"""
file:复制文件-02.py
date: 2018-07-上午7:42
author:ting
desc:
以读取大文件的方式实现,两种方式不同,但是执行的结果相同
"""
# 打开文件
file_read = open('README')
file_write = open('README_COPY','w')
# 读写文件
while True:
text = file_read.readline()
if not text:
break
file_write.write(text)
# 关闭文件
file_read.close()
file_write.close()
README_COPY文件
westoshello
##另外一种读写文件的方法
####读文件
pi_digitals文件
3.14215926
2.185235364
4.533465758
# _*_ coding:utf-8 _*_
"""
file:读文件-01.py
date: 2018-07-上午8:12
author:ting
desc:
相当于read
关键字with在不需要访问文件后将其关闭,在这个程序中,我们调用了open(),
但没有调用close();你也可以调用open()和close()来打开和关闭文件,但这
样做时,如果程序存在bug,导致close()语句没有执行,文件将不会关闭,未妥
善地关闭文件可能会导致数据丢失或受损。
如果在程序中过早地调用close(),你会发现需要使用文件时他已经关闭(无法访问),
这会导致更多的错误,你并非在任何情况下都能轻松确定关闭文件的恰当时机,通过使用with
结构,可以让python去确定,你只管打开文件,并在需要时使用它,python会在合适的时候自动将其关闭
"""
with open('pi_digitals') as file_object:
contents = file_object.read()
print contents
# _*_ coding:utf-8 _*_
"""
file:读文件-02.py
date: 2018-07-上午8:16
author:ting
desc:
相当于 readline
"""
filename = 'pi_digitals'
with open(filename) as file_object:
for line in file_object:
print line
# _*_ coding:utf-8 _*_
"""
file:读文件-03.py
date: 2018-07-上午8:25
author:ting
desc:
只读取文件的第一行
"""
filename = 'pi_digitals'
with open(filename) as file_object:
lines = file_object.readline()
print lines
# _*_ coding:utf-8 _*_
"""
file:写文件-01.py
date: 2018-07-上午8:19
author:ting
desc:
相当于write
"""
filename = 'linux'
with open(filename,'w') as file_object:
file_object.write('I am ok.\n')
file_object.write('i like you.\n')
linux文件
I am ok.
i like you.
# _*_ coding:utf-8 _*_
"""
file:写文件-02.py
date: 2018-07-上午8:24
author:ting
desc:
相当于追加
"""
filename = 'linux'
with open(filename,'a') as file_object:
file_object.write('I am ok.\n')
file_object.write('i like you.\n')
linux文件
I am ok.
i like you.
I am ok.
i like you.
#json 模块
####json.dump
# _*_ coding:utf-8 _*_
"""
file:json.dump.py
date: 2018-07-上午8:38
author:ting
desc:
给文件中写入内容
很多程序都要求用户输入某种信息,程序都把用户提供的信息存储在列表和字典等数据结构中,
用户关闭程序时,几乎总是要保存他们的的信息
有一种简单的方式是使用模块json来存储数据
(在python中使用json的时候,主要也就是使用json模块,json是一种良好的模块)
模块json让你能够将简单的python数据结构转存到文件中,并在程序再次运行时加载该文件中的数据,
你还可以使用json在python程序之间分享数据,你还可以使用json在python程序之间分享数据,更重
要的是,json数据格式并非python专用的,这让你能够将以json格式存储的数据与使用其他编程语言的人分享
注意:json(javascriptObject notation)格式最初是javascript开发的,被包括python在内的众多语言采用
"""
# 导入json模块
import json
number = [1,2,3,4]
with open('number.json','w') as f_obj:
json.dump(number,f_obj)
number文件内容
[1, 2, 3, 4]
# _*_ coding:utf-8 _*_
"""
file:json.dump-举例.py
date: 2018-07-上午8:52
author:ting
desc:
写入
"""
import json
username = raw_input('what is your name?')
filename = 'username.json'
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print 'we will rember you~~,%s' % username
username文件
"little wang"
# _*_ coding:utf-8 _*_
"""
file:json.dump-举例-02.py
date: 2018-07-上午8:59
author:ting
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 rember you~~,%s' % username
username文件
"little wang""lily"
####json模块
# _*_ coding:utf-8 _*_
"""
file:json.load.py
date: 2018-07-上午8:38
author:ting
desc:
把文件中的内容读取出来
"""
import json
filename = 'number.json'
with open(filename) as f_object:
# 我们使用函数json.load加载存储在number.json中的信息
# 并将其存储到变量number中
number = json.load(f_object)
print number
# _*_ coding:utf-8 _*_
"""
file:json.load-举例.py
date: 2018-07-上午8:58
author:ting
desc:
输出
"""
import json
filename = 'username.json'
with open(filename) as f_object:
username = json.load(f_object)
print 'welcome back,%s' % username
# _*_ coding:utf-8 _*_
"""
file:综合应用.py
date: 2018-07-上午9:02
author:ting
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 your name?')
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print 'we will rember you~~'
# 依赖于try代码块成功执行的代码都应放到else代码块中
else:
print 'welcome back %s' % username
In [1]: ls
file
In [2]: import os
In [3]: ls
file
In [4]: os.rename('file','westos') #重命名
In [5]: ls
westos
In [6]: os.remove('westos') #删除文件
In [7]: ls
In [8]: os.mkdir('test') #建立目录
In [9]: ls #成功建立
test/
In [10]: os.rmdir('test') #删除目录
In [11]: ls