第十章 文件和异常
- 文件的读取
- 整个读取(注:rstrip()方法清楚字符串末尾的空白,strip()方法清除字符串开头的空白)
- 逐行读取
01 with open('C:\\Users\\Franz\\Desktop\\pi_digits.txt') as file_object: 02 contents=file_object.read();#整个读取 03 print(contents.rstrip());#方法rstrip剔除字符串末尾的空白 04 05 with open('C:\\Users\\Franz\\Desktop\\pi_digits.txt') as file_object: 06 # 逐行读取 07 print("逐行读取"); 08 for line in file_object: 09 print(line.rstrip()); >>> 3.1415926535 8979323846 2643383279 逐行读取 3.1415926535 8979323846 2643383279 |
- 创建一个包含文件各行内容的列表(利用方法readlines())
01 with open('C:\\Users\\Franz\\Desktop\\pi_million_digits.txt') as file_object: 02 lines = file_object.readlines() 03 04 pi_string = '' 05 for line in lines: 06 pi_string += line.strip() 07 print(pi_string[0:50]) 08 print(len(pi_string)); 09 birthday = input("Enter your birthday, in the form mmddyy: ") 10 if birthday in pi_string: 11 print("Your birthday appears in the first million digits of pi!") 12 else: 13 print("Your birthday does not appear in the first million digits of pi.") >>> 3.141592653589793238462643383279502884197169399375 1000002 Enter your birthday, in the form mmddyy: 1231996 Your birthday appears in the first million digits of pi! |
- 文件的写入
注意:
- 文本写入文件, 你在调用open() 时需要提供另一个实参, 告诉Python你要写入打开的文件
(实参'w'告诉Python, 我们要以写入模式 打开这个文件。 打开文件时, 可指定读取模式 'r'、 写入模式'w'、附加模式 'a' 或让你能够读取和写入文件的模式'r+')
- 以写入'w' 模式打开文件时千万要小心, 因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件;写入的文件不存在时,则会重新创建一个文件。
- Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中, 必须先使用函数str() 将其转换为字符串格式
01 filename = 'programming.txt' 02 with open(filename, 'w') as file_object: 03 file_object.write("I love programming.\n"); 04 file_object.write("I love creating new games.\n"); 05 06 """ 07 停下查看写入文件,发现上述写入结果: 08 I love programming. 09 I love creating new games. 10 重新以附加模式'a'给文件添加内容,不会覆盖原有的内容,如下是演示示例 11 """ 12 identi=input("以附加模式存储文件(是填Yes,否填No):"); 13 while identi!='Yes': 14 identi=input("以附加模式存储文件(是填Yes,否填No):"); 15 filename = 'programming.txt' 16 with open(filename, 'a') as file_object: 17 file_object.write("I also love finding meaning in the large database.\n"); 18 file_object.write("I also creating apps that can run in a browser.\n"); 19 """ 20 查看文件的输出结果为: 21 I love programming. 22 I love creating new games. 23 I also love finding meaning in the large database. 24 I also creating apps that can run in a browser. 25 """ |
- 异常
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。 每当发生让Python不知所措的错误时,它都会创建一个异常对象。
异常是使用try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息, 而不是令用户迷惑的traceback。
try-except-else代码块的工作原理大致如下:Python尝试执行try 代码块中的代码;只有可能引发异常的代码才需要放在try 语句中。有时候,有一些仅在try 代码块成功
执行时才需要运行的代码;这些代码应放在else代码块中。except代码块告诉Python,如果它尝试运行try 代码块中的代码时引发了指定的异常, 该怎么办。
- 零除错误(ZeroDivisonError)
01 print("Give me two numbers, and I'll divide them.") 02 print("Enter 'q' to quit.") 03 while True: 04 first_number = input("\nFirst number: ") 05 if first_number == 'q': 06 break 07 second_number = input("Second number: ") 08 try: 09 answer = int(first_number) / int(second_number) 10 except ZeroDivisionError: 11 print("You can't divide by 0!") 12 else: 13 print(answer) >>> Give me two numbers, and I'll divide them. Enter 'q' to quit.
First number: 25 Second number: 4 6.25
First number: 12 Second number: 0 You can't divide by 0!
First number: q |
- FileNotFoundError 异常
(使用方法split() , 它根据一个字符串创建一个单词列表)
01 def count_words(filename): 02 """这是一个给英文书籍统计字数的函数""" 03 try: 04 with open(filename) as f_obj: 05 contents = f_obj.read() 06 except FileNotFoundError: 07 msg = "Sorry, the file " + filename + " does not exist." 08 print(msg) 09 else: 10 # 计算文件大致包含多少个单词 11 words = contents.split() 12 num_words = len(words) 13 print("The file " + filename + " has about " + str(num_words) + " words.") 14 15 16 filenames=['alice.txt','sidehartha.txt','moby_dick.txt','little_women.txt']; 17 for filename in filenames: 18 count_words(filename); >>> The file alice.txt has about 29461 words. Sorry, the file sidehartha.txt does not exist. The file moby_dick.txt has about 215136 words. The file little_women.txt has about 189079 words. |
- 运行异常时不报任何错误
在except代码块中利用pass语句明确地告诉Python什么都不要做。以上述为例
01 def count_words(filename): 02 """这是一个给英文书籍统计字数的函数""" 03 try: 04 with open(filename) as f_obj: 05 contents = f_obj.read() 06 except FileNotFoundError: 07 pass #利用关键词pass跳过错误反馈部分 08 else: 09 # 计算文件大致包含多少个单词 10 words = contents.split() 11 num_words = len(words) 12 print("The file " + filename + " has about " + str(num_words) + " words.") 13 14 15 filenames=['alice.txt','sidehartha.txt','moby_dick.txt','little_women.txt']; 16 for filename in filenames: 17 count_words(filename); >>> The file alice.txt has about 29461 words. The file moby_dick.txt has about 215136 words. The file little_women.txt has about 189079 words. |
- 存储数据
用户关闭程序时, 要保证高度的保存储存他们提供的信息; 一种简单的方式是使用模块json 来存储数据
- 函数json.dump(variable,filename) 接受两个实参: 要存储的数据以及可用于存储数据的文件对象。
- 函数json.load(filename)
01 import json 02 # 如果存储了用户名,则加载它 03 # 如果未存储,则输入用户名并进行存储 04 filename='username.json'; 05 try: 06 with open(filename) as f_obj: 07 username=json.load(f_obj); 08 except FileNotFoundError: 09 username=input("what is your name?"); 10 with open(filename,'w') as f_obj: 11 json.dump(username,f_obj); 12 print("We'll remember you when you come back,"+username+'!'); 13 else: 14 print("Welcome back, "+username+"!"); >>> Welcome back, Franz! |
- 重构
代码能够正确地运行, 但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构
重构让代码更清晰、 更易于理解、 更容易扩展。