异常:作为python创建的特殊对象,用于管理运行中出现的错误
json模块:用来存储用户数据
open()函数: 打开文件 as file_object: 函数open()返回一个表示文件的对象
with 关键字:在不需要访问文件后将其关闭 作用相当于close(),但程序出现bug时,close()不会运行,文件不会关闭,会导致新错误
read()方法: 读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量content中,打印content,就可以显示出文本内容了
10-1在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python知识,其中每一行都以“In Python you can”打头。将这个文件命名为learning_python.txt,并将其存储到为完成本章练习而编写的程序所在的目录中。编写一个程序,它读取这个文件,并将你所写的内容打印三次:第一次打印时读取整个文件;第二次打印时遍历文件对象;第三次打印时将各行存储在一个列表中,再在with代码块外打印它们。
1 with open('learning_python.txt') as file_object: 2 contents = file_object.read() 3 print('------读取整个文件-----') 4 print(contents) 5 6 filename = 'learning_python.txt' 7 8 with open(filename) as file_object: 9 print('----------遍历文件对象------') 10 for line in file_object: 11 12 print(line.rstrip()) #rstrip() 作用删除末尾的换行符 strip删除左边的空格 13 14 filename = 'learning_python.txt' 15 16 with open(filename) as file_object: 17 lines = file_object.readlines() 18 19 print('-------将各行存储在一个列表中-------') 20 for line in lines: 21 22 print(line.rstrip())
10-2读取你刚创建的文件learning_python.txt中的每一行,将其中的Python都替换为另一门语言的名称,如C。将修改后的各行都打印到屏幕上。
1 '''''' 2 filename = 'learning_python.txt' 3 4 with open(filename) as file_object: 5 lines = file_object.readlines() 6 7 txt_string = '' 8 for line in lines: 9 txt_string += line.strip() #将存储的给txt_string 10 c = txt_string.replace('Python', 'c') #要设定一个变量c接收,不然虽不会报错,但结果不是正确的 11 print(c) 12 print(len(c))
10-3访客:编写一个程序,提示用户输入其名字;用户作出响应后,将其名字写入到文件guest.txt中。
1 ''' 2 filename = 'guest.txt' #定义一个文件名 3 c = input("请输入名字") 4 with open(filename, 'w') as file_object: #以写入的模式打开这个文件 5 file_object.write(c) 6 7 ''' 8 '''a附加模式, w写入模式, r读取模式,r+读取和写入模式'''
10-4访客名单:编写一个while循环,提示用户输入其名字。用户输入其名字后,在屏幕上打印一句问候语,并将一条访问记录添加到文件guest_book.txt中。确保这个文件中的每条记录都独占一行。
1 '''filename = 'guest_book.txt' 2 3 with open(filename, 'r+') as file_object: 4 while True: 5 c = input("请输入名字") 6 if c == 'quit': 7 break 8 else: 9 file_object.write("名字是:" + c + "\n") 10 '''
10-5关于编程的调查:编写一个while循环,询问用户为何喜欢编程。每当用户输入一个原因后,都将其添加到一个存储所有原因的文件中。
1 ''' 2 filename = 'whylike.txt' 3 4 with open(filename, 'w') as file_object: 5 while True: 6 c = input("为甚对编程如痴如醉: ") 7 print("告知在下退下二字即可") 8 if c == '退下': 9 break 10 else: 11 file_object.write("原因是: " + c + "\n") 12 '''
10-6加法运算:提示用户提供数值输入时,常出现的一个问题是,用户提供的是文本而不是数字。在这种情况下,当你尝试将输入转换为整数时,将引发TypeError异常。编写一个程序,提示用户输入两个数字,再将它们相加并打印结果。在用户输入的任何一个值不是数字时都捕获TypeError异常,并打印一条友好的错误消息。对你编写的程序进行测试:先输入两个数字,再输入一些文本而不是数字。
1 ''' 2 a = input("请输入数值: ") 3 b = input("请输入数值: ") 4 try: 5 print(int(a) + int(b)) #try尝试运行这条代码,会报错就跳到except except可以后加具体错误如valuename, filenNotfind 6 except: 7 print("输入的不是数字!程序自动退出") 8 '''
10-7加法计算器:将你为完成练习10-6而编写的代码放在一个while循环中,让用户犯错(输入的是文本而不是数字)后能够继续输入数字。
1 '''while True: 2 print("\na 加 b ") 3 print("输入q 退出") 4 5 a = input("\n请输入数值a: ") 6 if a == 'q': 7 break 8 b = input("请输入数值b: ") 9 if b == 'q': 10 break 11 try: 12 c = int(a) + int(b) 13 except ValueError: 14 print("写数字都不会还说自己是黑社会?") 15 else: 16 print(c) 17 '''
10-8猫和狗:创建两个文件cats.txt和dogs.txt,在第一个文件中至少存储三只猫的名字,在第二个文件中至少存储三条狗的名字。编写一个程序,尝试读取这些文件,并将其内容打印到屏幕上。将这些代码放在一个try-except代码块中,以便在文件不存在时捕获FileNotFound错误,并打印一条友好的消息。将其中一个文件移到另一个地方,并确认except代码块中的代码将正确地执行。
1 #10-8创建 2 ''' 3 filename = 'dogs.txt' 4 5 with open(filename, 'w') as file_object: 6 file_object.write("dog's name is 小白\n") 7 file_object.write("dog's name is 小黄\n") 8 file_object.write("dog's name is 小黑") 9 filename = 'cats.txt' 10 11 with open(filename, 'w') as file_object: 12 file_object.write("cat's name is 小花\n") 13 file_object.write("cat's name is 猫眼罗\n") 14 file_object.write("cat's name is 大白沙") 15 ''' 16 '''txts = ["cats.txt", 'dogs.txt'] 17 for i in txts: 18 try: 19 with open(i) as f: #f==file_object简写 20 contents = f.read() 21 print(contents) 22 except FileNotFoundError: #出现文件找不到错误弹出print() 23 print("The file %s does not exist." % i) 24 ''' 25 ''' 26 filename = ['dogs.txt', 'cats.txt'] 27 for i in filename: 28 try: 29 with open(i) as file_object: 30 contents = file_object.read() 31 print(contents) 32 except FileNotFoundError: 33 msg = "Sorry, The file " + filename + " doesn't find," 34 print(msg) 35 ''' 36 #10 - 8 37 ''' 38 def read_txt(filename): 39 """读取文件并显示""" 40 try: 41 with open(filename) as f_obj: 42 contents = f_obj.read() 43 print(contents) 44 except: 45 msg = " Sorry, the file " + filename + " doesn't find." 46 print(msg) 47 48 filenames = ['dogs.txt', 'cats.txt'] 49 for filename in filenames: 50 read_txt(filename) 51 '''
10-9沉默的猫和狗:修改你在练习10-8中编写的except代码块,让程序在文件不存在时一言不发。
1 ''' 2 def read_txt(filename): 3 """读取文件并显示""" 4 try: 5 with open(filename) as f_obj: 6 contents = f_obj.read() 7 print(contents) 8 except: 9 pass 10 11 filenames = ['dogs.txt', 'cats.txt'] 12 for filename in filenames: 13 read_txt(filename) 14 '''
10-10常见单词:访问项目Gutenberg(http://gutenberg.org/),并找一些你想分析的图书。下载这些作品的文本文件或将浏览器中的原始文本复制到文本文件中。你可以使用方法count()来确定特定的单词或短语在字符串中出现了多少次。例如,下面的代码计算'row'在一个字符串中出现了多少次:
>>>line = "Row, row, row your boat"
>>>line.count('row')
2
>>>line.lower().count('row')
3
请注意,通过使用lower()将字符串转换为小写,可捕捉要查找的单词出现的所有次数,而不管其大小写格式如何。编写一个程序,它读取你在项目Gutenberg中获取的文件,并计算单词'the'在每个文件中分别出现了多少次。
1 filenames = ['sometxt.txt', 'count_the.txt'] 2 for filename in filenames: 3 4 with open(filename, encoding="utf8") as file_object: 5 contents = file_object.read() 6 print(contents.count("the"))
10-11喜 欢 的 数 字 : 编 写 一 个 程 序 , 提 示 用 户 输 入 他 喜 欢 的 数 字 , 并 使 用json.dump()将这个数字存储到文件中。再编写一个程序,从文件中读取这个值,并打印消息“I know your favorite number! It’s _____.”。
1 ''' 2 #likenum.py 3 4 import json 5 6 number = input("亲输入您喜欢的数字: ") 7 8 filename = 'likenum.json' 9 10 with open(filename, 'w') as f_obj: 11 json.dump(number, f_obj) 12 print("您喜欢的数字是: " + number + '已存储') 13 14 ##read_likenum.py 15 16 import json 17 18 filename = 'likenum.json' 19 20 with open(filename) as f_obj: 21 likenum = json.load(f_obj) 22 print("输出了存储中您喜欢的数字: " + likenum + ' ') 23 '''
10-12记住喜欢的数字:将练习10-11中的两个程序合而为一。如果存储了用户喜欢的数字,就向用户显示它,否则提示用户输入他喜欢的数字并将其存储到文件中。运行这个程序两次,看看它是否像预期的那样工作。
1 #合并版 2 ''' 3 import json 4 5 #如果以前存储了数字,就加载它 6 #否则,就提示用户输入用户名并存储它 7 filename = 'likenumber.json' 8 try: 9 with open(filename) as f_obj: 10 likenumber = json.load(f_obj) 11 except: 12 likenumber = input("您喜欢的数字是啥,告诉我,我帮你存起来: ") 13 with open(filename, 'w') as f_obj: 14 json.dump(likenumber, f_obj) 15 print("彰显您存储的数字的时候来啦,数字是; " + likenumber + ' ') 16 else: 17 print("您存储的数是; " + likenumber + "!") 18 '''
10-13验证用户:最后一个remember_me.py版本假设用户要么已输入其用户名,要么是首次运行该程序。我们应修改这个程序,以应对这样的情形:当前和最后一次运行该程序的用户并非同一个人。为此,在greet_user()中打印欢迎用户回来的消息前,先询问他用户名是否是对的。如果不对,就调用get_new_username()让用户输入正确的用户名
1 #10-13 2 3 import json #导入json模块 4 5 def get_stored_username(): 6 """如果储存了用户名, 就获取它""" 7 filename = 'username.json' 8 try: 9 with open(filename) as f_obj: 10 username = json.load(f_obj) 11 except FileNotFoundError: 12 return None 13 else: 14 return username 15 def get_new_username(): 16 """提示用户输入用户名""" 17 username = input("你的名字是? " ) 18 filename = 'username.json' 19 with open(filename, 'w') as f_obj: 20 json.dump(username, f_obj) 21 return username 22 23 def greet_user(): 24 """问候用户, 并指出其名字""" 25 username = get_stored_username() 26 if username: 27 result = input(username + "是你的名字吗? ") 28 if result == 'yes': 29 print("欢迎回来, " + username + "!") 30 else: 31 username = get_new_username() 32 print("欢迎回来, " + username + "!") 33 else: 34 username = get_new_username() 35 print("我们将会记住你当你回来时, " + username + "!") 36 37 greet_user()
本章学习了如何使用文件,打开、写入等,读取整个文件,各种方式的写入,如文本附加到文件末尾用‘a',和程序异常的处理,报错的处理fileNotFindError,ValueError,NameError等,存储python数据,保存用户提供信息,