python学习(十)文件和异常-(下)

异常

  • 使用被称为异常的特殊对象来管理程序执行期间发生的错误。
  • 每当发生python不知所措的错误时,都会创建一个异常对象。
  • 编写处理该异常的代码,程序将继续执行。
  • 如果未对异常做出处理,程序将停止,并显示一个traceback。
  • 使用try-except代码块处理异常

处理ZeroDivisionError异常

print(5/0)

Traceback (most recent call last):
  File "D:\学习笔记\python学习笔记\第十章\division.py", line 6, in <module>
    print(5/0)
ZeroDivisionError: division by zero
[Finished in 0.1s with exit code 1]

使用try-except代码块

  • 编写一个try-except代码块来处理可能引发的异常
try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero")
    
You can't divide by zero
[Finished in 0.3s]

使用异常避免崩溃

print("Give me two number,and I'll divide them.")
print("Enter q to quit.")
while True:
    first_number = input("\n First number: ")
    if first_number == 'q':
        break
    second_number = input("\n Second number" )
    if second_number == 'q':
        break
    answer = int(first_number)/int(second_number)
    print(answer)
    
Give me two number,and I'll divide them.
Enter q to quit.

 First number: 10

 Second number3
3.3333333333333335

 First number: 5

 Second number0
Traceback (most recent call last):
  File "division.py", line 20, in <module>
    answer = int(first_number)/int(second_number)
ZeroDivisionError: division by zero

***Repl Closed***

else代码块

  • 将可能发生的错误放在try-except代码块中,依赖于try代码块成功执行的代码都应该放在else代码块中。
print("Give me two number,and I'll divide them.")
print("Enter q to quit.")
while True:
    first_number = input("\n First number: ")
    if first_number == 'q':
        break
    second_number = input("\n Second number" )
    if second_number == 'q':
        break
    try:
        answer = int(first_number)/int(second_number)
    except  ZeroDivisionError:
        print("You can't divide by 0.")
    else:
        print(answer)
        
Give me two number,and I'll divide them.
Enter q to quit.

 First number: 10

 Second number3
3.3333333333333335

 First number: 5

 Second number0
You can't divide by 0.

 First number: q

***Repl Closed***

  • try-except-else代码块的工作原理。python尝试执行try代码块中的代码,在try代码成功执行的运行代码放在else中,try代码引发异常的放在excepy中。

处理FileNotFoundError异常

  • 读取一个不存在的文件
filename = 'alice.txt'
with open(filename) as f_obj:
    contents = f_obj.read()
    
Traceback (most recent call last):
  File "D:\学习笔记\python学习笔记\第十章\alice.py", line 2, in <module>
    with open(filename) as f_obj:
FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'
[Finished in 0.3s with exit code 1]
  • 这个错误时open()函数导致的,所以try语句放在包含open()的代码之前
filename = 'alice.txt'

try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except  FileNotFoundError:
    mes = "Sorry, the file " + filename + "does net exist"
    print(mes)
    
    
Sorry, the file alice.txtdoes net exist
[Finished in 0.4s]

分析文本

  • 使用方法split(),根据一个字符创创建一个单纯列表。
>>> title = "alice in wonderland"
>>> title.split()
['alice', 'in', 'wonderland']
  • 方法split()以空格为分隔符将字符串拆分成多个部分。将这些部分都存储在列表中。
filename = 'alice.txt'

try:
    with open(filename) as f_obj:
        contents = f_obj.read()
except  FileNotFoundError:
    mes = "Sorry, the file " + filename + "does net exist"
    print(mes)

else:
    word = contents.split()
    num_word = len(word)
    print("The file " + filename + "has about " + str(num_word) + " words.") 
    
The file alice.txthas about 29461 words.
[Finished in 0.1s]

使用多个列表

  • 将这个程序中的大部分代码移到一个名为count_words()的函数中。
def  count_word(filename):
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except  FileNotFoundError:
        mes = "Sorry, the file " + filename + "does net exist"
        print(mes)

    else:
        word = contents.split()
        num_word = len(word)
        print("The file " + filename + "has about " + str(num_word) + " words.") 

filename = 'alice.txt'
count_word(filename)

The file alice.txthas about 29461 words.
[Finished in 0.1s]
  • 编写简单的循环,分析文本里包含的单词
def  count_word(filename):
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except  FileNotFoundError:
        mes = "Sorry, the file " + filename + "does net exist"
        print(mes)

    else:
        word = contents.split()
        num_word = len(word)
        print("The file " + filename + "has about " + str(num_word) + " words.") 

books = ['alice.txt','siddhartha.txt','moby_dict.txt','little_women.txt']
for book in books:
    count_word(book)
    
The file alice.txthas about 29461 words.
The file siddhartha.txthas about 42172 words.
The file moby_dict.txthas about 215136 words.
Sorry, the file little_women.txtdoes net exist
[Finished in 0.4s]

失败时一声不吭

  • 使用pass语句,可以在代码块中使用告诉python什么都不要做。
def  count_word(filename):
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except  FileNotFoundError:
        # mes = "Sorry, the file " + filename + "does net exist"
        # print(mes)
        pass

    else:
        word = contents.split()
        num_word = len(word)
        print("The file " + filename + "has about " + str(num_word) + " words.") 

books = ['alice.txt','siddhartha.txt','moby_dict.txt','little_women.txt']
for book in books:
    count_word(book)
    
The file alice.txthas about 29461 words.
The file siddhartha.txthas about 42172 words.
The file moby_dict.txthas about 215136 words.
[Finished in 0.3s]
  • pass语句充当占位符,提醒你在程序的某个地方什么都没做。

决定报错哪里错误

  • 决定什么时候向用户报告错误?什么情况下又应该在失败时一声不吭那。

  • 编写好的代码且经过详细测试的,不容易出现内部错误,如语法和逻辑错误。

  • 但是只要程序依赖外部因素,如用户输入,存在指定的文件,有网络连接,有可能出现异常。

  • 凭经验判断该在什么地方包含异常处理模块,以及出现错误时该向用户提供什么样的信息。

存储数据

  • 使用模块json来存储数据。
  • 模块json可以将简单的python数据结构存储在文件里,并在程序再次运行时加载该文件中的数据。
  • 使用json在python程序直接分享数据。
  • json并非python专用的,可以将json格式存储的数据与其他编程语言的人共享。
  • JSON(Javascript Object Notation),最初视为JavaScript设计的,后来成为一种常用格式

使用json.dump()和json.load()

  • 使用json.dump()来存储这组数字。
import json

numbers = [2,3,5,7,11,13]
filename = 'numbers.json'
with open(filename,'w') as file_object:
    json.dump(numbers,file_object)
    
  • numbers.json文件显示
[2, 3, 5, 7, 11, 13]
  • 函数json.dump()结束两个实参,要存储的数据,以及要存储数据的文件对象。
  • 使用jsom.load()将这个列表读取到内存中。
import json
filename = 'numbers.json'
with open(filename) as file_object:
    numbers = json.load(file_object)

print(numbers)

[2, 3, 5, 7, 11, 13]
[Finished in 0.3s]
  • 使用函数json.load()加载存储咋number.json的信息,然后将其存储在变量numbers

保存和读取用户生产的数据

  • 对于用户生产的数据,使用json保存很有用。
  • 如果不以某种形式进行存储,等程序停止运行时用户的信息会丢失。
  • 存储用户的名字
import json

username = input("What is your name? ")

filename = 'username.json'
with open(filename,'w') as file_object:
    json.dump(username,file_object)
    print("We'll remember you when you come back, " + username + '.')
    
What is your name? alice
We'll remember you when you come back, alice.

***Repl Closed***

  • username.json
"alice"
  • 在编写一个程序,向其名称被存储的用户发出问候
import json

filename = 'username.json'

with open(filename) as f_obj:
    username = json.load(f_obj)
    print("Welcome back " + username + '!')
    
Welcome back alice!
[Finished in 0.2s]
  • 将两个程序合并到一个程序。
import json

filename = 'username.json'
try:
    with open(filename) as f_obj:
        username = json.load(f_obj)
except  FileExistsError:
    username = input("What is your name? ")
    with open(filename,'w') as f_obj:
        json.dump(username,f_obj)
        print("We'll remember you when you come back, " + username + ".")
else:
    print("Welcome back, " + username)
    
Welcome back, alice
[Finished in 0.1s]

重构

  • 代码能够正确运行,但是可以做进一步改进
  • 将代码划分成一系列具体完成工作的函数,这样的过程叫做重构。
  • 重构让代码更清晰,更易于理解,更容易拓展。
  • 将所有的代码放在greet_user()的函数中。
import json

def greet_user():
    filename = 'username.json'
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except  FileExistsError:
        username = input("What is your name? ")
        with open(filename,'w') as f_obj:
            json.dump(username,f_obj)
            print("We'll remember you when you come back, " + username + ".")
    else:
        print("Welcome back, " + username)

greet_user()

Welcome back, alice
[Finished in 0.4s]
  • 重构greet_user(),将获取用户名的代码转移到另一个函数中。
import json


def get_stored_username():
    """如果存储了用户就获取他"""
    filename = 'username.json'
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except  FileExistsError:
        return None
    else:
        return username

def greet_user():
    """问候用户并指出其名字"""
    username = get_stored_username()
    if username:
        print("Welcome back " + username + ".")
    else:
        username = input("What is your name? ")
        filename = 'username.json'
        with open(filename,"w") as f_obj:
            json.dump(username,f_obj)
            print("We'll remember you when you come back, " + username + ".")

greet_user()

Welcome back alice.
[Finished in 0.2s]
  • 将greet_user的另一个代码提取出来。
import json

def get_stored_username():
    """如果存储了用户就获取他"""
    filename = 'username.json'
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except  FileExistsError:
        return None
    else:
        return username

def  get_new_user():
    """提示用户输入用户名"""
    username = input("What is your name? ")
    filename = 'username.json'
    with open(filename,'w') as f_obj:
        json,dump(username,f_obj)
    return username

def greet_user():
    """问候用户并指出其名字"""
    username = get_stored_username()
    if username:
        print("Welcome back " + username + ".")
    else:
        username = get_new_user()
        print("We'll remember you when you come back, " + username + ".")

greet_user()


Welcome back alice.
[Finished in 0.2s]

小结

  • 如何使用文件
  • 如何一次性读取文件,
  • 每次一行的方式读取文件
  • 如何写入文件,如何将文件附加到文件的尾行
  • 什么是异常,以及如何处理异常
  • 如何存储python的数据结构,以及保存用户存储的信息 。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容