Python 文件读写、异常处理与模块使用详解
文件读写
文件打开
通过前面的学习,我们掌握了Python编程的基础,但还有许多重要内容未涉及,如外部文件的读写、程序异常处理和模块的使用。本文将详细介绍这些内容,帮助读者更全面地掌握Python编程。
文件的读写是编程中的重要环节。大多数情况下,数据通过外部文件导入,处理后导出。因此,了解如何与文件交互至关重要。文件操作的第一步是打开文件,通用格式为 with open
,括号内需提供文件路径、打开模式和字符编码。
- 文件路径:文件路径是文件的地址信息,提供完整路径或相对路径均可。
- 打开模式:模式决定了文件的读写方式,如只读(
r
)、写入(w
)、追加(a
)等。 - 字符编码:指定文件的字符编码,如UTF-8或GBK。
示例:
with open(‘example.txt’, ‘r’, encoding=‘utf-8’) as f:
# 执行读写操作
文件读取
文件打开后,可以使用多种方法读取内容:
- read():读取整个文件内容。
- readline():逐行读取文件。
- readlines():将所有行读入列表。
示例:
with open(‘example.txt’, ‘r’, encoding=‘utf-8’) as f:
content = f.read()
print(content)
文件写入
写入文件有多种模式:
- 覆盖写(w):创建新文件或覆盖现有文件。
- 追加写(a):在文件末尾追加内容。
- 二进制写(wb):适用于二进制文件,如图片。
示例:
with open(‘output.txt’, ‘w’, encoding=‘utf-8’) as f:
f.write(‘Hello, World!\n’)
既读又写
某些情况下,需要同时读取和写入文件,使用r+
, w+
, a+
模式。
示例:
with open(‘example.txt’, ‘r+’, encoding=‘utf-8’) as f:
f.seek(0, 2) # 移动指针到文件末尾
f.write(‘Additional content\n’)
异常处理
常见异常
程序执行过程中可能出现异常,导致程序中断。常见的异常包括:
- 除零错误:除以零。
- 文件找不到错误:文件路径无效。
- 值错误:传入值不符合预期。
- 索引错误:索引超出范围。
- 类型错误:类型不匹配。
示例:
x = 1 / 0 # 除零错误
异常处理方法
使用try-except
语句捕捉异常,确保程序稳定运行。
示例:
try:
x = 1 / 0
except ZeroDivisionError:
print(“除零错误”)
还可以使用多个except
分支处理不同类型的异常,或使用except Exception
捕捉所有异常。
示例:
try:
x = 1 / 0
except ZeroDivisionError:
print(“除零错误”)
except FileNotFoundError:
print(“文件未找到”)
except Exception as e:
print(f"未知错误: {e}")
模块使用
模块简介
模块是封装好的代码,用于解决特定问题。Python提供了内置模块、第三方模块和自定义模块。
- 内置模块:如
time
,random
,collections
等。 - 第三方模块:如
numpy
,pandas
,matplotlib
等。 - 自定义模块:用户编写的
.py
文件。
导入模块
使用import
语句导入模块:
- 导入整个模块:
import module_name
- 导入特定函数/类:
from module_name import function_name
- 导入所有内容:
from module_name import *
示例:
import math
from random import randint
from numpy import *
模块查找路径
模块查找路径有三个优先级:
- 内存中已加载的模块。
- 内置模块。
sys.path
中的路径。
示例:
import sys
print(sys.path)
如果模块不在上述路径中,可以将其路径添加到sys.path
中。
示例:
sys.path.append(‘/path/to/module’)
markdown
文件读写部分
单选题
-
文件打开的通用格式是什么?
- A.
open("file_path", "mode")
- B.
with open("file_path", "mode") as f
- C.
with open("file_path", "mode")
- D.
open("file_path", "mode") as f
答案:B
- A.
-
with open
后面的模式参数中,r
表示什么?- A. 只写模式
- B. 追加模式
- C. 只读模式
- D. 创建模式
答案:C
-
在 Windows 系统下,默认的字符编码是什么?
- A. UTF-8
- B. GBK
- C. ASCII
- D. ISO-8859-1
答案:B
-
w
模式打开文件时,如果文件不存在会怎样?- A. 报错
- B. 创建新文件
- C. 打开现有文件
- D. 覆盖现有文件
答案:B
-
a
模式打开文件时,如果文件不存在会怎样?- A. 报错
- B. 创建新文件
- C. 打开现有文件
- D. 覆盖现有文件
答案:B
判断题
-
使用
with open
语句块可以自动关闭文件,不需要手动调用close()
方法。
答案:正确 -
r+
模式可以同时读取和写入文件,但如果文件不存在则会报错。
答案:正确 -
w+
模式可以同时读取和写入文件,但如果文件已存在则会覆盖原有内容。
答案:正确 -
a+
模式可以同时读取和写入文件,并且会在文件末尾追加内容。
答案:正确 -
b
模式可以单独使用,表示二进制文件模式。
答案:错误
异常处理部分
单选题
-
Python 中捕获所有异常的关键字是什么?
- A.
try
- B.
except
- C.
finally
- D.
Exception
答案:D
- A.
-
try-except
结构中,except
后面可以跟多个异常类型,用什么符号分隔?- A.
,
- B.
;
- C.
:
- D.
|
答案:A
- A.
-
try-except-else
结构中,else
块在什么时候执行?- A.
try
块中发生异常时 - B.
try
块中未发生异常时 - C. 总是执行
- D. 从不执行
答案:B
- A.
-
try-except-finally
结构中,finally
块在什么时候执行?- A.
try
块中发生异常时 - B.
try
块中未发生异常时 - C. 总是执行
- D. 从不执行
答案:C
- A.
-
捕获异常时,使用
as
关键字可以做什么?- A. 忽略异常
- B. 捕获异常的具体信息
- C. 终止程序
- D. 重新抛出异常
答案:B
模块导入部分
单选题
-
导入整个模块使用的语法是什么?
- A.
from module import *
- B.
import module
- C.
from module import function
- D.
import module.function
答案:B
- A.
-
从模块中导入特定函数使用的语法是什么?
- A.
from module import *
- B.
import module
- C.
from module import function
- D.
import module.function
答案:C
- A.
-
导入模块中的所有函数和类使用的语法是什么?
- A.
from module import *
- B.
import module
- C.
from module import function
- D.
import module.function
答案:A
- A.
-
模块查找路径的优先级顺序是什么?
- A. 内存 -> 内置模块 -> sys.path
- B. 内置模块 -> 内存 -> sys.path
- C. 内存 -> sys.path -> 内置模块
- D. 内置模块 -> sys.path -> 内存
答案:A
-
如何将新的路径添加到模块查找路径中?
- A.
sys.path.append("new_path")
- B.
sys.path.add("new_path")
- C.
sys.path.insert("new_path")
- D.
sys.path.extend("new_path")
答案:A
- A.
一、文件读写操作
题目1
根据文章内容,完成一个Python程序,该程序读取一个TXT文件,统计所有字符出现的频次,并将结果保存到另一个TXT文件中。
答案:
程序逻辑如下:
- 使用
open
函数以读取模式(r)打开源TXT文件,使用read
方法读取文件内容并赋值给变量s
。 - 将读取的内容传入一个自定义函数,此函数返回一个字典,字典键为字符,值为字符出现次数。
- 以写入模式(w)打开目标TXT文件。
- 使用for循环遍历字典,将字符及其频次逐行写入目标TXT文件。
题目2
程序执行后,假设源TXT文件是一篇小说,为什么输出的结果中数字较多?
答案:
因为这篇文本是一篇小说,而小说中往往包含大量对话、章节编号等元素,这些都可能含有数字,所以统计结果显示数字出现频率较高。
二、异常处理
题目3
根据文章内容,编写一段代码,提示用户输入一个数字,并确保用户输入的是有效数字,如果不是数字则提示错误信息。
答案:
程序逻辑如下:
使用while True创建一个死循环,在循环体内使用try-except结构捕获异常。try部分尝试将用户输入转换为数字,如果发生异常(如输入非数字),则在except分支中提示用户重新输入,直到输入正确跳出循环进入else分支打印用户输入的数字。
题目4
当用户输入字符或特殊符号时,程序如何响应?请举例说明。
答案:
当用户输入字符例如’a’,程序会提示"你输入的不是一个数字";当输入特殊符号例如’@',同样会提示"你输入的不是一个复字"(原文表述应为"你输入的不是一个数字")。只有当用户输入有效的数字,比如’123’时,程序才会显示"你输入的一个数字是123"并结束循环。
三、模块导入与调用
题目5
根据文章内容,构建一个名为screening_prime.py
的模块,其中包含一个函数用于筛选n以内所有素数。请写出该函数的主要逻辑。
答案:
程序逻辑如下:
定义一个名为is_prime
的函数,接收参数number表示待检测的数。若number等于1则直接返回False,因为1不是素数。接下来使用for循环从2开始遍历到number平方根加1(取整),检查number能否被当前迭代变量i整除,如果能则返回False表示不是素数。如果循环结束后没有找到任何因子,则返回True表示是素数。
题目6
在一个新的Python脚本中,如何导入screening_prime
模块中的is_prime
函数,并使用它找出1000以内的所有素数?
答案:
程序逻辑如下:
from screening_prime import is_prime。接着使用for循环从1到1000遍历每个数字i,对于每个i调用is_prime(i)判断是否为素数,如果是则打印该数字。