温锦文欧普厨电及净水器总代理 发表于 2024-8-28 12:52:33

Python文件篇(六)

文件的读取与写入

打开文件(open() 函数):
file = open("文件路径", "模式")


[*] 常用模式包罗:

[*]“r”:读取模式,文件必须存在。
[*]“w”:写入模式,会覆盖原文件或创建新文件。
[*]“a”:追加模式,在文件末端添加内容。
[*]“b”:二进制模式,适用于处理非文本文件(如图片、音频等)。
[*]“r+”:读写模式,文件必须存在。

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



[*]read():读取整个文件内容。
[*]readline():按行读取文件内容,每次读取一行。
[*]readlines():读取文件全部行,返回一个列表。
写入文件内容
file = open("example.txt", "w")
file.write("这是一个测试。\n")
file.writelines(["第一行\n", "第二行\n"])
file.close()



[*]write():写入字符串到文件。
[*]writelines():将一个字符串列表写入文件。
关闭文件(close() 方法):
file.close()
使用 with 语句: 使用 with 语句可以主动处理文件关闭,克制忘记关闭文件带来的资源泄露问题
with open("example.txt", "r") as file:
    content = file.read()
    print(content)
文件指针

文件指针是指向文件中当前位置的一个标记,它决定了从文件的哪个位置开始读写数据。文件指针的初始位置取决于文件打开的模式:


[*]如果以 “r”(读取)或 “r+”(读写)模式打开文件,文件指针最初位于文件的开头。
如果以 “w”(写入)或 “a”(追加)模式打开文件,文件指针分别位于文件的开头或末端
使用以下方法来控制文件指针的位置:


[*]seek(offset, whence):移动文件指针。
[*]offset:移动的字节数。
[*]whence:移动的出发点。常用的值有:

[*]0:文件开头(默认值)。
[*]1:当前位置。
[*]2:文件末端。

file = open("example.txt", "r")
file.seek(5)# 将文件指针移动到第5个字节处
content = file.read()# 从第5个字节开始读取内容
print(content)
file.close()

tell():返回当前文件指针的位置
file = open("example.txt", "r")
position = file.tell()# 获取当前文件指针位置
print(f"当前文件指针位置: {position}")
file.close()

非常处理

在Python中,非常处理是一种用于捕获和处理运行时错误的机制。当步调实行过程中遇到错误时,Python会引发一个非常,如果没有处理这个非常,步调就会终止运行。为了防止步调崩溃并提供更好的用户体验,可以使用非常处理机制
try, except, else, finally

常处理使用 try-except 结构。基本语法如下
try:
    # 尝试执行的代码
    可能会引发异常的代码
except 异常类型 as 异常变量:
    # 发生异常时执行的代码
    处理异常的代码
finally:
    # 无论是否发生异常,都会执行的代码
    清理资源的代码

[*] try 块
try 块中的代码是你以为可能会引发非常的部分。Python会尝试实行这些代码,如果没有非常,步调会正常继续实行。如果发生非常,步调会跳到对应的 except 块。
[*] except 块
except 块用于捕获和处理非常。你可以指定要捕获的非常范例,并在 except 块中定义怎样处理这些非常。你可以捕获特定范例的非常,也可以捕获全部非常。
捕获特定非常:
try:
    x = 1 / 0
except ZeroDivisionError as e:
    print(f"捕获到异常: {e}")
捕获全部非常:
try:
    x = 1 / 0
except Exception as e:
    print(f"捕获到异常: {e}")

[*]else 块(可选)
else 块在 try 块中没有发生非常时实行。它通常用于实行那些只有在成功完成 try 块中代码时才应该实行的操作。
try:
    x = 10 / 2
except ZeroDivisionError:
    print("发生除零错误")
else:
    print("成功执行,没有异常")

[*]finally 块(可选)
finally 块中的代码无论是否发生非常,都会实行。它通常用于清理资源,比如关闭文件或网络毗连。
try:    file = open("example.txt", "r")    content = file.read()except FileNotFoundError:    print("文件未找到")finally:    file.close()
    print("文件已关闭") 自定义非常
可以通过继续内置的 Exception 类来创建自己的非常类。自定义非常通常用于在特定环境下引发特定的错误,以便更机动地处理非常环境。
class MyCustomError(Exception):
    def __init__(self, message):
      self.message = message

try:
    raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:
    print(f"捕获到自定义异常: {e.message}"
案例实操

编写一个步调,读取用户指定的文件内容并计算其中的单词数量。如果文件不存在或出现其他错误
def count_words_in_file(filename):
    try:
      # 尝试打开文件
      with open(filename, 'r') as file:
            content = file.read()
      
      # 计算单词数量
      words = content.split()
      word_count = len(words)
      print(f"文件 '{filename}' 中有 {word_count} 个单词。")
   
    except FileNotFoundError:
      # 捕获文件未找到的异常
      print(f"错误:文件 '{filename}' 未找到。请检查文件名和路径是否正确。")
   
    except PermissionError:
      # 捕获文件权限不足的异常
      print(f"错误:没有权限读取文件 '{filename}'。")
   
    except Exception as e:
      # 捕获其他异常
      print(f"发生错误:{e}")
   
    finally:
      # finally 块会在程序结束时执行
      print("文件处理结束。")

# 示例:用户输入文件名进行操作
filename = input("请输入要读取的文件名:")
count_words_in_file(filename)
运行效果
环境1:文件存在且读取成功
请输入要读取的文件名:example.txt
文件 'example.txt' 中有 50 个单词。
文件处理结束。
环境2:文件不存在
请输入要读取的文件名:nonexistent.txt
错误:文件 'nonexistent.txt' 未找到。请检查文件名和路径是否正确。
文件处理结束。
环境3:文件权限不足
请输入要读取的文件名:restricted.txt
错误:没有权限读取文件 'restricted.txt'。
文件处理结束。
环境4:发生其他未知错误
如果发生了其他未预料到的错误,比如编码问题,步调会捕获通用的 Exception 非常并显示错误信息
请输入要读取的文件名:corrupted.txt
发生错误:'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
文件处理结束。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Python文件篇(六)