Python学习之路(10)文件和异常

茴香豆 Lv5

在本章中,你将学习处理文件,让程序能够快速地分析大量的数据;你将学习错误处理,避免程序在面对意外情形时崩溃;你将学习异常 ,它们是Python创建的特殊对象,用于管理程序运行时出现的错误;你还将学习模块json,它让你能够保存用户数据,以免在程序停止运行后丢失。在本章学习的技能可提高程序的适用性、可用性和稳定性。

1.从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
filename = 'pi_digits.txt'
# 读取整个文件
with open(filename) as file_object:
contents = file_object.read()
print(line.rstrip())
# 因为read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示就是一个空行。
# 要删除多出来的空行,可在print语句中使用rstrip()。

# 逐行读取
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
# 创建一个包含文件各行内容的列表
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())

2. 写入文件

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文 件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来 将这些输出读取到内存中并进行处理。

2.1写入空文件

1
2
3
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")

在这个示例中,调用open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参(’w’ )告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模式 (’r’ )、写入模式 (’w’ )、附加模式 (’a’ )或让你能够读取和写入文件的模式(’r+’ )。如果你省略了模式实参,Python将以默认的只读模式打开文件。

如果你要写入的文件不存在,函数open() 将自动创建它。

以写入 (’w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在, Python将会先清空该文件,再将指定内容写入文件。

2.2写入多行

1
2
3
4
5
filename = 'programming.txt'
# write()函数不会自动在文本末尾添加换行符,需要手动添加换行符
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")

2.3附加到文件

我们打开文件时指定了实参(’a’) ,以便将内容附加到文件末尾, 而不是覆盖文件原来的内容。

1
2
3
4
5
filename = 'programming.txt'
# write()函数不会自动在文本末尾添加换行符,需要手动添加换行符
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")

3.异常

Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误。每当 发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写 了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

异常是使用 try-except代码块处理的。try-except 代码块让Python执 行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误 消息,而不是令用户迷惑的traceback。

3.1使用try-except代码块

处理ZeroDivisionError异常的try-except代码块类似于下面这样:

1
2
3
4
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")

3.2使用else代码块

通过将可能引发错误的代码放在try-except代码块中,可提高这个程序抵御错误的能力。这个示例还包含一个else代码块;依赖于try 代码块成功执行的代码都应放到else代码块中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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("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)

3.3使用多个文件

下面我们统计多本书中的单词数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def count_words(filename):
"""Count the approximate number of words in a file."""
try:
with open(filename, encoding='utf-8') as f:
contents = f.read()
except FileNotFoundError:
# 提示某本书文件不存在
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
# 失败时一声不吭
# except FileNotFoundEror:
# pass
else:
# 计算包含多少个单词
words = contents.split()
num_words = len(words)
print(f"The file {filename} has about {num_words} words.")

filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
count_words(filename)

4.存储数据

很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可 视化的数据。不管专注的是什么,程序都把用户提供的信息存储在列表和 字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信 息;一种简单的方式是使用模块json 来存储数据。

模块json 让你能够将简单的Python数据结构转储到文件中,并在程序再次 运行时加载该文件中的数据。你还可以使用json 在Python程序之间分享数 据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以 JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便格式, 很有用,也易于学习。

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

函数json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象

1
2
3
4
5
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f:
json.dump(numbers, f)

使用json.load() 将这个列表读取到内存中

1
2
3
4
5
6
import json
filename = 'numbers.json'
with open(filename) as f:
numbers = json.load(f)
print(numbers)
# output: [2, 3, 5, 7, 11, 13]

4.2重构

你经常会遇到这样的情况:代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。 重构让代码更清晰、更易于理解、更容易扩展。

  • Title: Python学习之路(10)文件和异常
  • Author: 茴香豆
  • Created at : 2022-10-02 15:53:30
  • Updated at : 2022-10-03 09:01:59
  • Link: https://hxiangdou.github.io/2022/10/02/Python_10/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments