python基础知识——文件和异常
1. 读文件
1.1 读取整个文件
-
with open('a.txt') as f1: contents = f1.read() print(contents)
a.txt文件位于程序所在的目录中
关键字with在不再需要访问文件后将其关闭,使用with可以使你只负责打开文件,并在需要时使用它,python自会在合适的时候自动将其关闭
- 传递给函数open()的参数可以是相对路径,如with open(‘files/a.txt’) as f1:,相对路径是相对于当前运行程序所在的目录
- 传递给函数open()的参数可以是绝对路径,如下所示
-
path = 'D:\Python\codes\pi_digits.txt' with open(path) as f1: contents = f1.read() print(contents)
1.2 逐行读取
-
filename = 'pi_digits.txt' with open(filename) as f1: for line in f1: print(line)
运行结果
3.14159265357979 32384626433832 79
- 打印每一行时,因为每行末尾都有一个换行符,print语句也会加上一个换行符,因为每行末尾都有两个换行符,要消除这些多余的空白行,可在print语句中使用rstrip()函数,如print(line.rstrip())
1.3 创建一个包含文件各行内容的列表
- 使用关键字with时,open()返回的文件对象只在with代码块内可用
- 若要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表
-
filename = 'pi_digits.txt' with open(filename) as f1: lines = f1.readlines() for line in lines: print(line.rstrip())
readlines()方法从文件中读取每一行,并将其存储在一个列表中,该列表被存储到变量lines中
2. 写文件
- 调用open()时提供了两个实参,第二个实参可以是'r'读取模式,'w'写入模式,'a'附加模式,'r+'读取和写入,若省略,则默认以只读模式打开文件
- python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式
- 函数write()不会在写入的文本末尾自动添加换行符,所以可以手动添加空格、制表符或空行来设置输出的格式
- 若要给文件添加内容,而不是覆盖原有内容,可以附加模式打开文件
-
filename = 'pi_digits.txt' with open(filename, 'a') as f1: f1.write("\nI love programming.")
3. 异常
3.1 使用异常
- python使用被称为异常的特殊对象来管理程序执行期间发生的错误
- 若编写了处理异常的代码,程序将继续运行;若未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告
- 异常是使用try-except代码块处理的,使用try-except代码块之后,即使出现异常,程序也将继续运行
-
try: print(5/0) except ZeroDivisionError: print("You can't divide by zero!")
运行结果
You can't divide by zero!
- else代码块:依赖于try代码块成功执行的代码都放到else代码块中
- try-except-else代码块的工作原理大致如下:python尝试执行try代码块中的代码(只有可能引发异常的代码才需要放在try语句中),若发生了except指定的异常,则运行except代码块;若try代码块成功执行,则运行else代码块
-
print("Give me two numbers, and I'll divide them.") print("Enter 'q' to quit.") while True: first = input("\nFirst number: ") if first == 'q': break second = input("Second number: ") if second == 'q': break try: answer = int(first) / int(second) except ZeroDivisionError: print("You can't divide by 0!") else: print(answer)
3.2 处理FileNotFoundError异常
-
def count_words(filename): '''计算一个文件大致包含多少个单词''' try: with open(filename) as f1: contents = f1.read() except FileNotFoundError: msg = "Sorry, the file " + filename + " does not exist." print(msg) else: #计算文件大致包含多少个单词 words = contents.split() num = len(words) print("The file " + filename + " has about " + str(num) + " words.") filenames = ['a.txt', 'pi_digits.txt'] for filename in filenames: count_words(filename)
运行结果
Sorry, the file a.txt does not exist. The file pi_digits.txt has about 8 words.
3.3 发生错误时直接略过
- 我们并非每次在捕获到异常时都告知用户,有时你希望程序在发生异常时什么也不做
- python有一个pass语句,可在except代码块中使用pass告诉python发生异常时什么都不要做
-
except FileNotFoundError: pass
4. 存储数据
4.1 使用json.dump()和json.load()
- 下面演示了如何使用json.dump()来存储数字列表
-
import json numbers = [2, 3, 5, 7, 11] filename = 'numbers.json' with open(filename, 'w') as f1: json.dump(numbers, f1)
程序运行之后,文件numbers.json的内容为
[2, 3, 5, 7, 11]
- 下面演示了如何使用json.load()将这个列表读取到内存中
-
import json filename = 'numbers.json' with open(filename) as f1: numbers = json.load(f1) print(numbers)
运行结果为
[2, 3, 5, 7, 11]
5. 重构
- 重构——将代码划分为一系列完成具体工作的函数
- 重构使代码更清晰,更易于理解,更容易扩展