ch6 文件操作和异常处理

在这里插入图片描述
在这里插入图片描述

‘seek’ 函数用于将文件指针移动到指定位置,‘close’ 函数用于关闭文件,‘truncate’ 函数用于截断文件,‘tell’ 函数用于返回文件指针当前位置。

因此,只有 ‘tell’ 函数表示“返回文件指针”的操作。

以下是选项的具体说明:

  • ‘seek’ 函数用于将文件指针移动到指定位置。该函数有两个参数:第一个参数是文件指针,第二个参数是偏移量。偏移量可以是正数或负数,正数表示从文件开头开始移动,负数表示从文件结尾开始移动。
  • ‘close’ 函数用于关闭文件。该函数接受一个参数,即文件指针。成功关闭文件后,文件指针将变为无效。
  • ‘truncate’ 函数用于截断文件。该函数接受两个参数:第一个参数是文件指针,第二个参数是截断长度。截断长度可以是正数或负数,正数表示截断文件到指定长度,负数表示截断文件到当前位置。
  • ‘tell’ 函数用于返回文件指针当前位置。该函数接受一个参数,即文件指针。返回值是文件指针当前位置的偏移量。

在这里插入图片描述
在这里插入图片描述

loadloads 都是 Python 中用于解码 JSON 字符串的函数。load 函数用于从文件读取 JSON 数据,并将 JSON 数据解码成 Python 对象。loads 函数用于从字符串读取 JSON 数据,并将 JSON 数据解码成 Python 对象。

dumpdumps 都是 Python 中用于编码 Python 对象的函数。dump 函数用于将 Python 对象编码成 JSON 字符串,并将 JSON 字符串写入文件。dumps 函数用于将 Python 对象编码成 JSON 字符串。

因此,loads 函数是将已编码的 JSON 字符串解码成 Python 对象的方法。

以下是选项的具体说明:

  • load 函数用于从文件读取 JSON 数据,并将 JSON 数据解码成 Python 对象。该函数接受一个参数,即文件指针。返回值是解码后的 Python 对象。
  • loads 函数用于从字符串读取 JSON 数据,并将 JSON 数据解码成 Python 对象。该函数接受一个参数,即 JSON 字符串。返回值是解码后的 Python 对象。
  • dump 函数用于将 Python 对象编码成 JSON 字符串,并将 JSON 字符串写入文件。该函数接受两个参数:第一个参数是 Python 对象,第二个参数是文件指针。
  • dumps 函数用于将 Python 对象编码成 JSON 字符串。该函数接受一个参数,即 Python 对象。返回值是编码后的 JSON 字符串。

with 关键字可以自动管理资源,即使代码引发了异常,也能保证文件被正确关闭。

with 关键字的工作原理是使用上下文管理器。上下文管理器是一个对象,它定义了进入和退出上下文时要执行的代码。

with 语句的语法如下:

with context_manager as variable:
    # 代码块

在进入 with 语句块之前,上下文管理器对象的 enter() 方法会被调用。在退出 with 语句块之后,上下文管理器对象的 exit() 方法会被调用。

exit() 方法有两个参数:第一个参数是异常类型,第二个参数是异常值,第三个参数是异常堆栈跟踪。如果 with 语句块中没有引发异常,则 exit() 方法的参数将为 None。

with 关键字可以用于管理任何资源,包括文件、数据库连接、锁等。

以下是一个示例,说明如何使用 with 关键字来管理文件:

with open("myfile.txt", "w") as f:
    f.write("Hello, world!")

在这个示例中,with 关键字将自动关闭文件 f,即使代码引发了异常。

BaseException 是 Python 中所有异常的基类。这意味着所有异常都是 BaseException 的子类。

BaseException 类定义了以下属性:

  • args:一个元组,包含异常的参数。
  • message:一个字符串,包含异常的信息。
  • traceback:一个对象,包含异常的堆栈跟踪。

BaseException 类还定义了以下方法:

  • str():返回异常的字符串表示形式。
  • repr():返回异常的 repr() 表示形式。

BaseException 类是 Python 中异常处理的基础。通过继承 BaseException 类,可以创建自定义异常。

以下是 BaseException 类的示例:

class MyException(BaseException):
    pass

try:
    raise MyException("This is my exception")
except MyException as e:
    print(e)

输出:

This is my exception

在 Python 中,可以使用相同的 except 语句来处理多个异常信息。多个异常中的一个出现便执行 except 代码块。

except 语句的语法如下:

try:
    # 代码块
except (Exception1, Exception2, ...):
    # 处理异常的代码块

except 语句中的异常类型可以是任何 Python 异常。如果代码块引发了指定的异常类型之一,则 except 代码块将被执行。

以下是一个示例,说明如何使用相同的 except 语句来处理多个异常信息:

try:
    raise ValueError("This is a ValueError")
except (ValueError, TypeError):
    print("An error occurred")

输出:

An error occurred

在这个示例中,except 代码块将处理 ValueErrorTypeError 异常。

except 语句还可以使用 as 关键字来将异常对象赋值给一个变量。

以下是一个示例:

try:
    raise ValueError("This is a ValueError")
except ValueError as e:
    print(e)

输出:

This is a ValueError

在这个示例中,e 变量将引用 ValueError 异常对象。

try…finally… 语句无论是否发生异常都将会执行最后 finally 中的代码。

try…finally… 语句的语法如下:

try:
    # 代码块
finally:
    # 代码块

try 代码块中的代码可能引发异常。如果引发了异常,则 finally 代码块将在异常处理之后执行。如果 try 代码块没有引发异常,则 finally 代码块将在 try 代码块执行之后执行。

finally 代码块通常用于释放资源,例如关闭文件或数据库连接。

以下是一个示例,说明如何使用 try…finally… 语句来释放资源:

try:
    f = open("myfile.txt", "w")
    f.write("Hello, world!")
finally:
    f.close()

在这个示例中,finally 代码块将确保文件 f 被关闭,即使 try 代码块引发了异常。

补充说明:

  • try…finally… 语句与 try…except… 语句不同。try…except… 语句仅在发生异常时执行 except 代码块,而 try…finally… 语句无论是否发生异常都将执行 finally 代码块。
  • finally 代码块中的代码可以执行任何操作,包括释放资源、执行清理操作等。

建议:

  • 建议在需要释放资源或执行清理操作的情况下使用 try…finally… 语句。
  • finally 代码块中的代码应该尽可能简单,避免执行可能引发异常的操作。

在这里插入图片描述

pickle 模块是 Python 中用于序列化和反序列化的标准模块。pickle 模块可以将任意 Python 对象转换为一系列字节,也可以将一系列字节反序列化为 Python 对象。

dumps() 函数用于将 Python 对象序列化为一系列字节。loads() 函数用于将一系列字节反序列化为 Python 对象。

open()close() 函数是 Python 中用于打开和关闭文件的标准函数。open() 函数用于打开文件并返回一个文件对象。close() 函数用于关闭文件对象。

因此,dumps()loads() 函数属于 pickle 模块,而 open()close() 函数不属于 pickle 模块。

以下是 pickle 模块的示例:

import pickle

# 序列化
obj = {"name": "John Doe", "age": 30}
bytes_data = pickle.dumps(obj)

# 反序列化
obj2 = pickle.loads(bytes_data)

print(obj2)

输出:

{'name': 'John Doe', 'age': 30}

补充说明:

  • pickle 模块可以序列化任何 Python 对象,包括内置类型、自定义类型、甚至是函数和类。
  • pickle 模块生成的字节数据是平台相关的,不能在不同平台之间直接使用。
  • pickle 模块存在安全风险,不建议用于序列化不可信来源的数据。

建议:

  • 在需要将 Python 对象序列化为字节数据的情况下使用 pickle 模块。
  • 在序列化不可信来源的数据之前,请务必评估安全风险。

在这里插入图片描述

os 模块是 Python 中用于与操作系统交互的标准模块。os 模块提供了许多函数,用于执行文件操作、目录操作、环境变量操作、进程控制等操作。

os.access(path, mode) 函数用于检查当前进程是否对指定文件具有指定的访问权限。

os.chown(path, uid, gid) 函数用于更改指定文件的属主和组。

os.chflags(path, flags) 函数用于更改指定文件的标志。

os.pipe() 函数用于创建一个匿名管道。

以下是 os 模块的示例:

import os

# 检查文件是否可读
if os.access("myfile.txt", os.R_OK):
    print("File is readable")

# 更改文件属主
os.chown("myfile.txt", 1000, 100)

# 更改文件标志
os.chflags("myfile.txt", os.UF_APPEND)

# 创建匿名管道
r, w = os.pipe()

补充说明:

  • os 模块提供了许多函数,用于执行各种操作系统操作。
  • os 模块的函数通常是底层的,可能会因平台而异。
  • 在使用 os 模块之前,请务必阅读相关文档。

建议:

  • 在需要执行操作系统操作的情况下使用 os 模块。
  • 在使用 os 模块之前,请务必了解相关函数的用途和参数。
    在这里插入图片描述

os.path 模块是 Python 中用于处理路径和文件名的标准模块。os.path 模块提供了许多函数,用于获取路径信息、分割路径、组合路径、检查路径是否存在等操作。

splitext() 函数用于将路径名分割为文件名和扩展名。

getatime() 函数用于获取指定文件的访问时间。

expanduser() 函数用于将用户主目录的缩写形式扩展为完整路径。

join() 函数用于将多个路径名组合为一个路径。

以下是 os.path 模块的示例:

import os.path

# 分割路径名
filename, extension = os.path.splitext("/path/to/myfile.txt")

# 获取文件访问时间
atime = os.path.getatime("/path/to/myfile.txt")

# 扩展用户主目录
path = os.path.expanduser("~/myfile.txt")

# 组合路径
path = os.path.join("/path/to", "myfile.txt")

补充说明:

  • os.path 模块提供了许多函数,用于处理路径和文件名。
  • os.path 模块的函数通常是平台无关的。
  • 在使用 os.path 模块之前,请务必阅读相关文档。

建议:

  • 在需要处理路径和文件名的的情况下使用 os.path 模块。
  • 在使用 os.path 模块之前,请务必了解相关函数的用途和参数。
  • 在这里插入图片描述
    csv 模块中,定义为常量的选项是:

A、QUOTE_ALL:表示所有字段都将被引用。
B、QUOTE_MINIMAL:表示只有包含特殊字符的字段才会被引用。
C、QUOTE_NONNUMERIC:表示只有非数字字段才会被引用。
D、QUOTE_NONE:表示不引用任何字段。

以下是 csv 模块中定义的常量:

csv.QUOTE_ALL
csv.QUOTE_MINIMAL
csv.QUOTE_NONNUMERIC
csv.QUOTE_NONE

示例:

import csv

# 将所有字段都引用
with open('data.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, quotechar='"', quoting=csv.QUOTE_ALL)
    writer.writerow(['Name', 'Age', 'Country'])
    writer.writerow(['John Doe', 30, 'USA'])

# 只有包含特殊字符的字段才会被引用
with open('data.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, quotechar='"', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(['Name', 'Age', 'Country'])
    writer.writerow(['John Doe, Sr.', 30, 'USA'])

# 只有非数字字段才会被引用
with open('data.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(['Name', 'Age', 'Country'])
    writer.writerow(['John Doe', '30', 'USA'])

# 不引用任何字段
with open('data.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, quotechar='"', quoting=csv.QUOTE_NONE)
    writer.writerow(['Name', 'Age', 'Country'])
    writer.writerow(['John Doe', 30, 'USA'])

总结:

  • csv 模块定义了四个常量,用于控制如何引用字段。
  • 不同的引用模式会影响输出文件的格式。
  • 选择合适的引用模式取决于数据的类型和用途。

在这里插入图片描述

以下模块的简介:

A、math:该模块提供了一些数学函数,例如三角函数、指数函数、对数函数等。

B、wordcloud:该模块用于生成词云图片。

C、exceptions:该模块定义了 Python 中所有内置异常类型,例如 ValueErrorTypeErrorIndexError 等。

D、logging:该模块提供了一个通用的日志记录框架,允许程序员记录应用程序运行时的消息、警告和错误。

E、traceback:该模块提供了一些函数,用于获取和格式化堆栈跟踪信息。

以下是每个模块的详细说明:

A、math

math 模块定义了一些数学函数,例如:

  • 三角函数:sin()cos()tan()
  • 指数函数:exp()log()
  • 对数函数:log10()log2()
  • 平方根函数:sqrt()
  • 幂函数:pow()
  • 绝对值函数:abs()
  • 取整函数:floor()ceil()

示例:

import math

# 计算圆周率
pi = math.pi

# 计算 sin(x)
sin_x = math.sin(x)

# 计算 log(x)
log_x = math.log(x)

B、wordcloud

wordcloud 模块用于生成词云图片。词云图片是一种可视化文本数据的工具,它可以根据词语出现的频率来生成不同大小和颜色的词语。

示例:

from wordcloud import WordCloud

# 生成词云图片
wordcloud = WordCloud().generate(text)

# 显示词云图片
plt.imshow(wordcloud)
plt.show()

C、exceptions

exceptions 模块定义了 Python 中所有内置异常类型,例如:

  • ValueError:表示传入函数的参数无效
  • TypeError:表示传入函数的参数类型错误
  • IndexError:表示列表或元组索引越界
  • KeyError:表示字典中不存在指定的键
  • ZeroDivisionError:表示除数为零

示例:

try:
    # 可能会引发异常的代码
except exceptions.Exception as e:
    # 处理异常
    pass

D、logging

logging 模块提供了一个通用的日志记录框架,允许程序员记录应用程序运行时的消息、警告和错误。

示例:

import logging

# 记录消息
logging.info("This is a message")

# 记录警告
logging.warning("This is a warning")

# 记录错误
logging.error("This is an error")

E、traceback

traceback 模块提供了一些函数,用于获取和格式化堆栈跟踪信息。堆栈跟踪信息可以帮助程序员确定异常发生的原因。

示例:

import traceback

try:
    # 可能会引发异常的代码
except Exception as e:
    # 打印堆栈跟踪信息
    traceback.print_exc()

总结

  • math 模块提供了一些数学函数。
  • wordcloud 模块用于生成词云图片。
  • exceptions 模块定义了 Python 中所有内置异常类型。
  • logging 模块提供了一个通用的日志记录框架。
  • traceback 模块提供了一些函数,用于获取和格式化堆栈跟踪信息。

其他与记录排查异常相关的模块:

  • sys 模块:该模块提供了一些函数,用于获取有关 Python 解释器的信息,例如当前线程的堆栈跟踪信息。
  • pdb 模块:该模块提供了一个 Python 调试器,可以用来单步执行代码并检查变量值。

建议:

  • 在程序中使用 logging 模块记录异常信息。
  • 在需要时使用 traceback 模块获取和格式化堆栈跟踪信息。
  • 使用 sys 模块和 pdb 模块来调试异常。

在这里插入图片描述

traceback.print_exc() 函数能够将异常的详细信息格式化打印出来。

traceback 模块提供了一些函数,用于获取和格式化堆栈跟踪信息。traceback.print_exc() 函数是其中之一,它会将当前线程的堆栈跟踪信息格式化并打印到标准错误输出流 (stderr)。

示例:

try:
    # 可能会引发异常的代码
except Exception as e:
    # 打印异常详细信息
    traceback.print_exc()

输出:

Traceback (most recent call last):
  File "example.py", line 3, in <module>
    1 / 0
ZeroDivisionError: division by zero

traceback.print_exc() 函数打印的详细信息包括:

  • 异常类型
  • 异常信息
  • 堆栈跟踪信息

堆栈跟踪信息包含了导致异常发生的函数调用链。它可以帮助程序员确定异常发生的原因。

总结:

  • traceback.print_exc() 函数能够将异常的详细信息格式化打印出来。
  • 打印的详细信息包括异常类型、异常信息和堆栈跟踪信息。
  • 堆栈跟踪信息可以帮助程序员确定异常发生的原因。

其他与 traceback 模块相关的函数:

  • traceback.extract_tb():获取堆栈跟踪信息。
  • traceback.format_tb():格式化堆栈跟踪信息。
  • traceback.format_exception():格式化异常信息。

建议:

  • 在程序中使用 traceback.print_exc() 函数打印异常详细信息。
  • 使用 traceback 模块的其他函数来获取和格式化堆栈跟踪信息。

在这里插入图片描述

代码解析:

import string
mystring = 'in the dictionary'
mydict = dict.fromkeys(mystring, 0)  # 创建一个字典,键来自mystring,值都为0

for i in mystring:
    mydict[i] = mydict[i] + 1  # 统计每个字符在字典中的出现次数

max_num = max(mydict.values())  # 找到最大的字符出现次数

for item in mydict.items():
    if item[1] == max_num:
        print(item)  # 打印字符及其出现次数

解释:

  1. 导入和字符串创建:

    • import string (该代码中未使用)
    • mystring = 'in the dictionary' 创建了一个包含文本的字符串变量。
  2. 字典创建:

    • mydict = dict.fromkeys(mystring, 0) 使用 mystring 中的字符作为键,并将每个键的值设置为 0 来创建一个字典 mydict。这实际上是为每个字母初始化了一个字符计数。
  3. 字符计数:

    • for 循环迭代 mystring 中的每个字符 i
    • 在循环内部,mydict[i] = mydict[i] + 1 会增加字典 mydict 中当前字符 i 的计数。例如,对于第一个 ‘i’,mydict['i'] 最初为 0,然后增加到 1。这个过程会继续进行所有字符,统计它们的出现次数。
  4. 找到最大计数:

    • max_num = max(mydict.values()) 找到字典 mydict 中最大的值 (字符计数) 并将其存储在 max_num 中。
  5. 打印具有最大计数的字符:

    • 外部 for 循环迭代字典 mydict.items() 中的每个键值对 (item)。
    • if 条件检查当前项目的值 (item[1]) 是否等于最大计数 (max_num)。
    • 如果条件为真,则意味着当前字符具有最大计数。
    • if 块内,print(item) 打印整个键值对 (item),它是一个包含字符及其计数的元组 (例如,('i', 3))。

输出:

该代码的输出将是:

('i', 3)

输出解释:

  • 字符 ‘i’ 在字符串 mystring 中出现 3 次。
  • 循环迭代每个字符,统计它们的出现次数。
  • 字典 mydict 最终得到每个字符的计数:{‘i’: 3, ‘n’: 2, ’ ': 1, ‘t’: 1, ‘h’: 2, ‘e’: 2, ‘d’: 1, ‘c’: 1, ‘o’: 1, ‘r’: 1, ‘y’: 1}.
  • max_num 计算为 3 (最大计数)。
  • 最终循环迭代 mydict.items(),当遇到键值对 ('i', 3) 时,if 条件为真。
  • 因此,整个元组 ('i', 3) 被打印出来,表明字符 ‘i’ 具有最高计数 3。
  • 在这里插入图片描述
    在这里插入图片描述
    答案是 D、(‘me’, 6) (‘follow’, 5) (‘hands’, 4)

代码详解:

  1. 打开文件:

    • fb = open('test.txt', 'r') 打开文件 ‘test.txt’ 进行读取。
  2. 统计词频:

    • wordfre = {} 创建一个空字典来存储词频。
    • 循环遍历文件的每一行:
      • sword = line.split() 将行拆分成单词列表。
      • 循环遍历每个单词:
        • 如果单词在字典中,则其出现次数加 1:wordfre[word] += 1
        • 否则,将单词添加到字典并将其出现次数设置为 1:wordfre[word] = 1
  3. 对词频排序:

    • wordfrehigh = list(wordfre.items()) 将字典转换为列表,以便进行排序。
    • wordfrehigh.sort(key=lambda e: e[1]) 根据词频对列表进行排序(按出现次数从小到大)。
    • wordfrehigh[:-4:-1] 选择列表中倒数四个元素(出现次数最高的四个词)。
  4. 打印结果:

    • 循环遍历 wordfrehigh[:-4:-1] 中的每个元素:
      • print(wd, end='') 打印词频元组(不换行)。
  5. 关闭文件:

    • fb.close() 关闭文件。

因此,输出结果为:(‘me’, 6) (‘follow’, 5) (‘hands’, 4),表示 “me” 出现了 6 次,“follow” 出现了 5 次,“hands” 出现了 4 次,它们是出现次数最高的三个词。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
答案是 B、Error: End of file excepted.

代码分析:

  1. 主函数 main()

    • 循环执行,直到 doneTrue
    • 提示用户输入文件名并调用 readfile() 读取文件。
    • try...except 块中处理异常:
      • IOError: 文件不存在错误
      • ValueError: 文件内容无效错误
      • RuntimeError: 程序运行时错误
    • 计算文件中所有数值的总和并打印。
  2. 函数 readfile(filename)

    • 打开文件。
    • 调用 readdata() 读取数据。
    • finally 块中关闭文件(确保文件即使发生异常也能关闭)。
  3. 函数 readdata(infile)

    • 读取文件的第一行并转换为整数,表示数值的个数。
    • 读取指定个数的数值并添加到 data 列表中。
    • 再读取一行,如果这一行不为空(说明文件还有内容),则抛出 RuntimeError 异常。
    • 返回读取的数值列表。

针对 data.txt 的执行过程:

  1. 文件 data.txt 存在并可读取,所以不会引发 IOError
  2. 文件第一行为 “2”,可以正确转换为整数,所以不会引发 ValueError
  3. 函数 readdata() 读取了 “2”、“3”、“6” 三个数值,但是文件还有第四行 “9”,导致 line != "" 的条件成立,因此抛出 RuntimeError 异常,并打印错误信息 “Error: End of file excepted.”。

总结:

由于 data.txt 的内容比程序预期的多一行,导致了 RuntimeError 异常,所以程序的输出为 B、Error: End of file excepted.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、

data.txt的内容为

A
3
6
9

对于下面的代码,分析如果读入的文件是data.txt,则程序的输出是( )

def main():
    done = False
    while not done:
        try:
            filename = input("please enter the file name:")
            data = readfile(filename)
            
            total=0
            for value in data:
                total = total + value
                print("the sum is", total)
                done = True
        except IOError:
            print("Error:file not found")
        except ValueError:
            print ("Error:file contents invalid")
        except RuntimeError as error:
            print("Error:", str(error))
            
def readfile(filename):
    infile = open(filename, "r")
    try:
        return readdata(infile)
    finally:
        infile.close()
def readdata(infile):
    line = infile.readline()
    numberofvalues = int(line)
    data = []
    for i in range(numberofvalues):
        line = infile.readline()
        value = int(line)
        data.append(value)
        
    line = infile.readline()
        
    if line != "": #检测多于预期输入的异常
        raise RuntimeError("End of file excepted.")
    return data
    
if __name__ == '__main__':
    main()

A、

Error:file contents invalid
B、

Error: End of file excepted.
C、

Error:file not found
D、

End of file excepted.
在这里插入图片描述

解释:

  1. 文件打开:

    • 程序成功打开了文件 data.txt
  2. 读取第一行:

    • 程序读取了第一行 “A” 并尝试使用 int(line) 将其转换为整数。
    • 由于 “A” 不是有效的整数,因此会引发 ValueError 异常。
    • 程序捕获了 ValueError 异常并打印了错误消息 “Error: file contents invalid”。
  3. 程序终止:

    • 由于遇到了异常,程序会立即停止运行,不会进行任何进一步的处理或输出。

因此,由于文件的第一行无效,程序不会进行任何计算或遇到任何其他错误。

以下是代码的逐行解释:

def main():
    done = False
    while not done:
        try:
            filename = input("please enter the file name:")
            data = readfile(filename)

            total = 0
            for value in data:
                total = total + value
                print("the sum is", total)
            done = True
        except IOError:
            print("Error:file not found")
        except ValueError:
            print("Error: file contents invalid")
        except RuntimeError as error:
            print("Error:", str(error))

def readfile(filename):
    infile = open(filename, "r")
    try:
        return readdata(infile)
    finally:
        infile.close()

def readdata(infile):
    line = infile.readline()
    numberofvalues = int(line)
    data = []
    for i in range(numberofvalues):
        line = infile.readline()
        value = int(line)
        data.append(value)

    line = infile.readline()

    if line != "":  # 检测多于预期输入的异常
        raise RuntimeError("End of file excepted.")
    return data

if __name__ == '__main__':
    main()

main() 函数:

  • 该函数定义了一个循环,不断提示用户输入文件名并尝试读取文件。
  • 如果文件读取成功,则程序会尝试计算文件的总和并打印输出。
  • 如果遇到任何错误,则程序会根据错误类型打印相应的错误消息。

readfile() 函数:

  • 该函数打开指定的文件并尝试读取文件内容。
  • 如果读取成功,则函数会返回文件内容。
  • 如果遇到任何错误,则函数会抛出异常。

readdata() 函数:

  • 该函数读取文件的第一行并将其转换为整数,表示文件中的数值个数。
  • 然后,函数会循环读取指定个数的数值并将其添加到列表中。
  • 最后,函数会检查文件是否还有内容,如果还有则抛出异常。

由于文件的第一行 “A” 不是有效的整数,因此程序会在调用 readdata() 函数时引发 ValueError 异常,并最终打印错误消息 “Error: file contents invalid”。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值