第十章:处理文件和异常

#学习处理文件,让程序能够快速地分析大量的数据
#学习错误处理,避免程序在面对意外情形时崩溃
#学习异常,是python创建的特殊对象,用于管理程序运行时出现
#学习模块json,它让你能够保存用户数据,以免在程序停止运行后丢失
10.1 从文件中读取数据

#10.1.1 读取整个文件

#10.1.3 逐行读取
##调用For循环
# filename= 'pi_digits.txt'
# with open (filename) as file_object:#使用了关键字with,让python负责妥善地打开和关闭文件。
# for line in file_object:#为查看文件的内容,我们通过对文件对象执行循环来遍历文件中的每一行
# print(line.rstrip())
#10.1.4 创建一个包含文件各行内容的列表
# filename = 'pi_digits.txt'
# with open(filename) as file_object:
# lines = file_object.readlines()
# for line in lines:
# print(line.rstrip())


#10.2.1写入空文件
 
filename = 'programming.txt'

with open (filename,"w") as file_object:
file_object.write(" I love programming.") #10.2.3附加到文件 #以‘a'的附加模式打开,写入到文件的行都将添加到文件末尾
filename = 'programming.txt'

with open (filename,"a") as file_object:
file_object.write(" also love finding meaning in large datasets.\n")
file_object.write(" i love creating apps that can run in a browser.\n")


#10.3 异常

#10.3.1 处理ZeroDivisionError异常

# try:
# print(5/0)
# except ZeroDivisionError:
# print(" You can't divide by zero ")

10.3.3 使用异常避免崩溃
#try-except-else代码块的工作原理大致如下:

#处理FileNotFoundError 异常

#可以使用try-except 代码块以直观的方式进行处理。

filename= 'alice.txt'
try:
with open(filename) as f_obj:## 会由几率发生异常的运行
contens = f_obj.read()##将read()得到的内容放进contens里面
except FileNotFoundError:#如果发生FileNotFoundError异常就执行一下行代码
msg="Sorry , the file " + filename + " does not exist."
print(msg)##输出一个提醒代码

10.3.4 else代码块
#try-except-else代码块的工作原理大致如下:
print("Give me two numbers , and i'll divide them .")
print("Enter 'q' to quit .") while True:
first_number=input("\nFirst number: ")
if first_number=='q':
break
second_number=input("\nSecond number: ")
try: ###### try-except-else代码块的工作原理,python尝试执行try代码块中的代码;
        answer = int(first_number) / int(second_number)###有可能发生异常的一行代码
except ZeroDivisionError:            #except代码块告诉python,出现ZeroDivisionError异常时该怎么办,下一行就是异常后执行的代码块。
        print("You can't divide by 0!")
else:                       ####只有可能引发异常的代码才需要放在try语句中;有一些仅在try代码块成功执行时才需要运行的代码,并且放在else语句里面
        print(answer)
10.3.6分析文本

#以空格为分隔符将字符串将字符串分拆成多个部分,并将这些部分都存储到一个列表中
# title = "Alice in Wonderland "
# a=title.split()#它时根据一个字符串创建一个单词列表。
# print(a) 10.3.7 使用多个文件
def count_words(filename):
"计算一个文件大致有多少个单词"
try:
with open (filname) as f_obj:
contents= f_obj.read()
except FileExistsError: # 如果想在失败时候一声不吭,可以在except代码块中明确什么都不做,可以写入pass代码
msg="Sorry , the file" + filename + " does not exist."
print(msg)
else:
#计算文件大致包含多少个单词
words= contents.split()#尝试计算它包含多少个单词,原理:根据一个字符串创建一个单词列表。
num_words = len(words)
print("The file " + filename + "has about" + str(num_words) + "words") filename = ['alice.text','siddhartha.txt','moby_dick.txt']
for filename in filenames:
  count_words(filename)
在以上代码可知,使用try-except代码块提供了两个重要的优点:避免让用户看到traceback;让程序能够分析能够找到的其他文件。

10.4存储数据

#模块json让你能够将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
#json 格式最初是为(JavaScriptObject Notation) 格式最初是为Javascript开发。
 
 
import json
numbers=[2,3,4,56,15] filename = 'number.json' ##使用文件扩展名。json来指出文件存储的数据为JSON格式。
with open(filename,'w')as f_obj:
json.dump(numbers,f_obj)      ##函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
print(numbers)

两个使用了两个不同函数,一个是load一个dump 。
import json
filename = 'number.json'
with open(filename) as f_obj:
numbers=json.load(f_obj)      ##我们使用函数json.load()加载存储在numbers.json中的信息,并将其存储到变量numbers中。 print(numbers)
 
import json

def get_stored_username():
##如果存储了用户名,就获取它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
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()


10.4.3重构

这个是remember_me.py的这个最终版本中,每个函数都执行单一而清晰的任务。我们调用greet_user(),他打印一条合适的消息

###要么欢迎老用户回来,要么问候新用户

首先 调用 get_stored_username() ,这个函数只负责获取存储的用户名(如果存储了的话),再在必要时调用get_stored-username(),这个函数只负责获取并存储新用户的用户名。

这种划分必不可少!!!!
import json

def get_stored_username():
##如果存储了用户名,就获取它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
return None
else:
return username def get_new_username():
#提示用户输入用户名
uesrname1=input("What is your name?")
filename='username1.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_username()
print("We'll remember you when you come back," + username + "!") greet_user()


Python学习3月8号【python编程 从入门到实践】---》笔记(1)的更多相关文章

  1. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  2. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  3. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  4. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  5. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

  6. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  7. Python编程从入门到实践笔记——if语句

    Python编程从入门到实践笔记——if语句 #coding=utf-8 cars=['bwm','audi','toyota','subaru','maserati'] bicycles = [&q ...

  8. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

  9. Python编程从入门到实践笔记——列表简介

    Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...

  10. Python编程从入门到实践笔记——变量和简单数据类型

    Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...

随机推荐

  1. 2019-10-7-WPF-如何跨线程重新抛出异常

    title author date CreateTime categories WPF 如何跨线程重新抛出异常 lindexi 2019-10-07 13:24:54 +0800 2019-10-4 ...

  2. Redis源码解析:07压缩列表

    压缩列表(ziplist)是列表键和哈希键的底层实现之一.当列表键只包含少量列表项,并且每个列表项要么是小整数值,要么是长度较短的字符串时:或者当哈希键只包含少量键值对,并且每个键值对的键和值要么是小 ...

  3. @atcoder - CODE FESTIVAL 2017 Final - J@ Tree MST

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点,第 i 点有一个点权 Xi,再给定一棵边带权的树 ...

  4. Hbase数据模型物理视图

  5. Best Open Source Software

    Best Open Source Software Open Source, Software, Top The promise of open source software is best qua ...

  6. hdu 3934 Summer holiday (凸包+旋转卡壳)

    Problem - 3934 晚上为了演示给师弟看水平序的凸包是多么的好写,于是就随便找了一题凸包,25min居然1y掉了.. 代码如下: #include <cmath> #includ ...

  7. swiper仿tab栏切换

    转载  https://developers.weixin.qq.com/community/develop/article/doc/000040a5dc4518005d2842fdf51c13 小程 ...

  8. Python os.getcwd() 方法

    Python os.getcwd() 方法  Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...

  9. HDU1711 Number Sequence 题解 KMP算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目大意:最基础的字符串匹配,只不过这里用整数数组代替了字符串. 给你两个数组 \(a[1..N ...

  10. Flex AIR自定义Mobile的弹出框组件

    做Flex Mobile开发的人应该知道,Flex为手机应用并没有提供弹出框组件,需要自定义. 通过查找文档.资料,我做出一个效果还算不错的弹出框组件,可以适用于手机设备上,不多讲,直接贴源码,相信对 ...