跟着查老四学Python Day 6:文件操作和异常处理

时间:2022-01-18 01:19:32

文件操作

例行寒暄之后,课程正式开始

查老四:好的,我们来学习一下Python中的文件操作。文件操作是编程中非常基础和重要的一部分,它允许我们读取和写入文件。Python支持文本文件和二进制文件的读写,下面我们来逐一介绍。

首先,我们需要打开一个文件。Python中使用open()函数来打开文件,它的语法如下

file = open(file_path, mode)

其中,file_path是文件的路径,mode是打开文件的模式,可以是'w'、'r'、'a'等。'w'表示写模式,'r'表示读模式,'a'表示追加模式。如果我们不指定模式,open()函数默认为读模式。

下面我们来看一下如何打开一个文件:

file = open("example.txt", "w")

上面的代码打开了一个名为example.txt的文件,并将其赋值给变量file。由于我们指定了写模式('w'),所以如果文件不存在,Python会自动创建一个新文件。如果文件已经存在,那么打开文件后,文件中原有的内容将被清空。

接下来,我们可以使用write()方法向文件中写入内容:

file.write("Hello, World!")

上面的代码将字符串"Hello, World!"写入到文件中。请注意,在写入完成后,我们需要使用close()方法关闭文件。

file.close()

接下来,我们来看一下如何读取文件中的内容。与写入类似,我们需要使用open()函数来打开文件,不过这次我们需要指定读模式('r'):

file = open("example.txt", "r")

我们可以使用read()方法来读取整个文件的内容:

content = file.read()

如果文件非常大,一次性读取可能会导致内存问题。在这种情况下,我们可以使用readline()方法逐行读取文件的内容,或使用readlines()方法将文件的每一行读取到一个列表中。

#逐行读取文件内容
line = file.readline()

#读取所有行到一个列表中
lines = file.readlines()

当我们完成文件读取后,需要使用close()方法关闭文件。

file.close()

除了文本文件,Python还支持二进制文件的读写操作。当我们打开二进制文件时,需要指定模式为'wb'(写二进制文件)或'rb'(读二进制文件)。

下面是一个示例代码,展示了如何使用Python打开、写入和读取文件

#写入文件
file = open("example.txt", "w")
file.write("Hello, World!")
file.close()

#读取文件
file = open("example.txt", "r")
content = file.read()
print(content)
file.close()

以上就是Python文件操作的基本知识,下面是一个简单的文件操作练习题:

假设有一个名为example.txt的文本文件,其中包含了一些整数,请编写一个程序,读取该文件中的所有整数,并计算它们的平均值。请注意,文件中每个整数占一行。

提示:你可以使用Python内置的sum()函数计算整数的总和,使用len()函数计算整数的个数。

在编写代码之前,请先创建一个名为example.txt的文件,并在其中添加一些整数,每行一个。例如:

1
2
3
4
5

习题

以下是一个Python程序,用于读取名为example.txt的文件中的整数并计算它们的平均值。注意,首先确保您已创建了一个包含整数的example.txt文件。

# 打开文件并使用with语句自动关闭它
with open("example.txt", "r") as file:
    # 读取文件中的所有行,并将其保存为一个列表
    lines = file.readlines()

# 使用列表推导式从每一行提取整数
integers = [int(line.strip()) for line in lines]

# 计算整数总和和个数
total_sum = sum(integers)
count = len(integers)

# 计算平均值
average = total_sum / count

# 使用f-string输出结果
print(f"The average of the integers in the file is: {average}")

这个程序首先打开example.txt文件并读取其中的所有行,然后遍历这些行,将字符串转换为整数并存储在一个列表中。接下来,它使用sum()和len()函数计算整数的总和和个数,进而得出平均值。最后,它使用f-string格式化字符串输出计算出的平均值。

查老四的答案

好的,下面是计算example.txt文件中整数平均值的Python程序:

with open("example.txt", "r") as file:
    integers = [int(line) for line in file]

average = sum(integers) / len(integers)
print(f"The average is: {average}")

在上面的程序中,我们首先使用with语句打开文件example.txt,并将文件句柄赋值给变量file。然后,我们使用列表推导式将文件中的每一行转换为整数,并将这些整数存储到列表integers中。

接下来,我们使用内置的sum()函数计算integers中所有整数的总和,使用len()函数计算integers中整数的个数,最后计算平均值并将其打印到控制台上。请注意,在with语句中打开文件后,Python会自动在程序执行完毕后关闭文件,因此我们不需要再使用close()方法关闭文件。

如果你在example.txt文件中输入了上面给出的5个整数,那么程序的输出将是:

The average is: 3.0

查老四的答案确实更简洁


异常处理

查老四:好的,接下来我们将继续学习Python的异常处理。在程序执行过程中,可能会出现各种各样的错误,例如文件不存在、除数为零等。如果我们没有对这些错误进行处理,程序就会崩溃,用户将无法使用我们编写的程序。因此,在编写程序时,我们需要考虑可能出现的错误,并对其进行相应的处理。Python中的异常处理机制为我们提供了一个非常便捷的方式来处理这些错误。

在Python中,当程序出现错误时,它会抛出一个异常。我们可以使用try-except语句来捕获异常并进行处理。try-except语句的基本语法如下:

try:
    # 可能会出现异常的代码块
except ExceptionType1:
    # 异常类型为ExceptionType1时执行的代码块
except ExceptionType2:
    # 异常类型为ExceptionType2时执行的代码块
...
except:
    # 所有其他类型的异常时执行的代码块
finally:
    # 不论是否出现异常都会执行的代码块

在上面的语法中,try语句块包含可能会出现异常的代码。当程序执行try语句块时,如果出现异常,Python会将控制流转移到与异常类型相匹配的except语句块。如果except语句块中没有与异常类型匹配的代码块,则会跳过该语句块,并将异常传递给下一个语句块。如果所有的except语句块都没有匹配的代码块,则会将异常传递给调用该函数的代码。finally语句块中的代码不论是否出现异常都会执行。

接下来,我们来看一个示例程序,展示了如何使用try-except语句来捕获异常:

try:
    # 可能会出现异常的代码块
    x = 1 / 0
except ZeroDivisionError:
    # 如果出现ZeroDivisionError异常,执行以下代码块
    print("除数不能为零")
except:
    # 如果出现其他异常,执行以下代码块
    print("发生了其他错误")
finally:
    # 不论是否出现异常,都会执行的代码块
    print("程序执行完毕")

在上面的代码中,我们尝试将1除以0,这是一个不合法的操作,会导致ZeroDivisionError异常的抛出。由于我们使用了try-except语句,因此程序不会崩溃,而是会输出"除数不能为零",然后继续执行finally语句块中的代码。

finally子句和raise语句的用法

查老四:除了使用try-except语句,Python还提供了finally子句和raise语句来帮助我们处理异常。finally子句中的代码不论是否出现异常都会执行,因此我们可以将一些清理代码放在finally语句块中,以确保它们得到执行。raise语句可以让我们在程序中手动抛出一个异常。raise语句的基本语法如下:

raise ExceptionType("错误信息")

在上面的语法中,ExceptionType是一个异常类型,"错误信息"是一个可选的字符串,用于描述错误信息。当程序执行raise语句时,它会抛出一个ExceptionType类型的异常,并在控制台上显示错误信息。我们可以使用raise语句来主动抛出异常,以便在程序中进行一些特殊的处理。

接下来,我们来看一个示例程序,展示了如何使用finally子句和raise语句来处理异常:

try:
    # 可能会出现异常的代码块
    x = int("abc")
except ValueError as e:
    # 如果出现ValueError异常,执行以下代码块
    print(f"发生了值错误:{e}")
finally:
    # 不论是否出现异常,都会执行的代码块
    print("程序执行完毕")
    raise RuntimeError("发生了运行时错误")

在上面的代码中,我们尝试将字符串"abc"转换为整数,这是一个不合法的操作,会导致ValueError异常的抛出。由于我们使用了try-except语句,因此程序不会崩溃,而是会输出"发生了值错误",然后继续执行finally语句块中的代码。在finally语句块中,我们使用raise语句抛出一个RuntimeError异常,并输出"发生了运行时错误"。由于没有任何代码来捕获这个异常,因此它将被传递给调用该函数的代码,从而导致程序崩溃。

希望以上示例程序能够帮助您理解Python中的异常处理机制。


查老四:下面是两道练习题,都涉及到异常处理:

练习题1:使用try-except语句处理异常

请编写一个程序,读取用户输入的两个整数,并计算它们的商。如果用户输入的第二个数为零,程序应该输出一个错误消息并要求用户重新输入。如果用户输入的不是整数,程序应该输出一个错误消息并要求用户重新输入。当用户输入正确的两个整数时,程序应该输出它们的商。

提示:可以使用Python的input()函数读取用户的输入,并使用int()函数将字符串转换为整数。可以使用try-except语句捕获ValueError和ZeroDivisionError异常。

练习题2:使用finally语句清理资源

请编写一个程序,读取文件example.txt中的内容,并将其中的每一行输出到控制台上。请注意,在打开文件后,需要使用finally语句关闭文件,以释放资源。

提示:可以使用with语句打开文件,可以使用文件对象的readlines()方法读取文件的所有行。

练习一

以下是一个Python程序,读取用户输入的两个整数并计算它们的商。

def get_integer_input(prompt):
    while True:
        try:
            user_input = int(input(prompt))
            return user_input
        except ValueError:
            print("Invalid input. Please enter an integer.")

def calculate_division(num1, num2):
    while True:
        try:
            result = num1 / num2
            return result
        except ZeroDivisionError:
            print("Division by zero is not allowed. Please enter a non-zero denominator.")
            num2 = get_integer_input("Enter the second integer (non-zero): ")

# 从用户那里获取两个整数
num1 = get_integer_input("Enter the first integer: ")
num2 = get_integer_input("Enter the second integer (non-zero): ")

# 计算两个整数的商
result = calculate_division(num1, num2)

# 使用f-string输出结果
print(f"The division result of {num1} and {num2} is: {result}")

这个程序首先定义了两个函数:get_integer_input()用于获取用户输入的整数,并在输入错误时提示用户重新输入;calculate_division()用于计算两个整数的商,并在除数为零时提示用户重新输入。程序通过调用这两个函数来获取用户输入的整数并计算它们的商,然后使用f-string格式化字符串输出结果。

练习 二

以下是一个Python程序,按照要求读取example.txt文件中的内容并将每一行输出到控制台。请确保已创建包含若干行文本的example.txt文件。

# 定义一个函数来处理文件的打开、读取和关闭操作
def read_and_print_lines(file_path):
    try:
        # 使用with语句打开文件
        with open(file_path, "r") as file:
            # 读取文件中的所有行,并将其保存为一个列表
            lines = file.readlines()
    except FileNotFoundError:
        print("The specified file could not be found.")
        return
    finally:
        # 关闭文件,释放资源
        file.close()

    # 遍历行列表并逐行输出到控制台
    for line in lines:
        print(line.strip())

# 调用read_and_print_lines()函数,传入example.txt文件的路径
read_and_print_lines("example.txt")

这个程序定义了一个名为read_and_print_lines()的函数,该函数接受要打开的文件的路径作为参数。在函数中,我们尝试使用with语句打开文件,然后使用文件对象的readlines()方法将文件的所有行读取到一个列表中。最后,我们使用finally语句关闭文件以释放资源。在关闭文件后,我们遍历行列表并逐行输出到控制台。

查老四的答案

练习题1答案:

while True:
    try:
        num1 = int(input("请输入第一个整数:"))
        num2 = int(input("请输入第二个整数:"))
        result = num1 / num2
        print(f"{num1} / {num2} = {result}")
        break
    except ValueError:
        print("输入的不是整数,请重新输入")
    except ZeroDivisionError:
        print("第二个数不能为零,请重新输入")

在上面的程序中,我们使用了while循环来反复要求用户输入两个整数,直到输入正确的两个整数为止。在每次循环中,我们使用try-except语句来捕获ValueError和ZeroDivisionError异常,如果出现这些异常,则输出相应的错误消息,并要求用户重新输入。如果没有出现异常,则计算两个整数的商并输出结果。

练习题2答案:

try:
    with open("example.txt", "r") as file:
        lines = file.readlines()
        for line in lines:
            print(line.strip())
except FileNotFoundError:
    print("文件不存在")
finally:
    if "file" in locals():
        file.close()

在上面的程序中,我们使用with语句打开文件example.txt,并使用readlines()方法读取所有行。然后,我们使用for循环遍历所有行,并使用strip()方法去除每行末尾的换行符。如果文件不存在,则程序会输出一个错误消息。最后,我们使用finally语句关闭文件,以释放资源。请注意,在try语句块中打开文件后,Python会自动在程序执行完毕后关闭文件,因此我们不需要再使用close()方法关闭文件.

查老四确实更简洁