【Python】文件操作和异常处理

举报
向阳花花花花 发表于 2023/07/28 16:10:13 2023/07/28
【摘要】 本文介绍Python文件操作和异常处理

一、文件操作

1.1 打开和关闭文件

Python open() 方法用于打开一个文件,并返回文件对象。

在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError

  • 打开已存在的文件:
  • 使用r打开可读,写报错io.UnsupportedOperation: not writable
  • 使用w打开可写,读报错io.UnsupportedOperation: not readable
  • 打开不存在的文件
  • 使用r打开报错FileNotFoundError: [Errno 2] No such file or directory: ‘xxx.xxx’
  • 使用w打开会新建文件

下面通过代码分别演示上面的示例。

# 1.1 用只读模式打开已存在的文件

file = open("a.txt", "r") # a.txt文件内容是123
content = file.readline()  # 读不会报错
print(content)
file.write("321")  # 写会报错 io.UnsupportedOperation: not writable
file.close()

# 1.2 用只写模式打开已存在的文件

file = open("a.txt","w")
file.write("123") # 写不会报错
content = file.readline() # 读会报错 io.UnsupportedOperation: not readable
file.close()

# 2.1 用只读模式打开不存在的文件

file = open("b.txt","r") # 报错 FileNotFoundError: [Errno 2] No such file or directory: 'b.txt'
file.close()

# 2.2 用只写模式打开不存在的文件

file = open("b.txt","w")
file.write("123")
file.close()


Python close() 方法用于关闭文件。关闭后文件不能再进行读写操作。

文件IO要及时关闭,防止其他应用程序无法使用这个文件。

1.2 读写文件

  • read()方法读取: 读取指定个数数据,读完后指针移动到最后读取的数据后
  • readline()方法读取:默认读取一行,也可以读取指定数据
  • readlines()方法读取:读取文件的全部数据

a.txt文件里的内容如下:

依次使用上面三种方法读取:

# 1.read()
print("1.使用read方法读取文件:")
f = open("a.txt", "r")
content = f.read(5)  # 读5个字符,读完后光表移到了第五个字符后面
print(content)
content = f.read(5)  # 从第5个字符开始读
print(content)
f.close()

print()

# 2.readline() 读取一行,或读取指定个数的字符
print("2.使用readline方法读取文件:")
f = open("a.txt", "r")
primary = f.readline()
print(primary, end="")
primary = f.readline(5)  # 读取5个字符
print(primary)
f.close()

print()

# 3.readlines() # 以列表的形式,每一行的数据作为一个列表元素,读取全部文件
print("3.使用readlines方法读取文件:")
f = open("a.txt", "r")
content = f.readlines()
print(content)
i = 1
for con in content:
    print("第%d个元素:%s" % (i, con), end="")
    i += 1
f.close()

二、异常处理

2.1 异常处理格式

Python 有两种错误很容易辨认:语法错误和异常。

语法错误是在程序允许前被Python语法分析器检测出来的。

运行期检测到的错误被称为异常。

根据上面的例题,用只读 r 打开一个不存在的文件是将发生FileNotFoundError

下面通过处理这个异常来演示Python异常处理的格式。

(1)处理单个异常


# 用只读模式打开不存在的文件,处理异常
try:
    file = open("b.txt","r") # 报错 FileNotFoundError: [Errno 2] No such file or directory: 'b.txt'
    file.close()
except FileNotFoundError:
    print("出错了")
    pass


(2)处理多个异常

try:
    print(name)  # name未定义将发生nameError
    f = open("b.txt", "r")  # b.txt不存在将发生FileNotFoundError
except (NameError, FileNotFoundError) as ex:  # 定义异常对象ex用于获取异常信息
    print(ex)
    pass

(3)try——except——finally使用

先看下面的代码:

try:
    f = open("b.txt","r") # FileNotFoundError
except FileNotFoundError as ex:
    print(ex) # 打印异常信息
finally:
    f.close()

代码中的 f 是局部变量,finally语句中肯定不能使用f,所以会报NameError。

将代码加以改进:


import time

try:
    f = open("b.txt", "r")  # FileNotFoundError
    try:
        while True:
            content = f.readline()
            if len(content) == 0:
                break
            time.sleep(2)  # 让代码停顿两秒
            print(content)
    finally:
        f.close()
        print("关闭文件")
except FileNotFoundError as ex:
    print(ex)  # 打印异常信息
    

打开a.txt 文件:

2.2 File+Error例题

定义两个函数,分别完成读和写功能

要求将poetry.txt文件内容复制到copy.txt文件中。


# 读操作
def read():
    strs = ""  # 结果串
    flag = True
    try:
        file = open("poetry.txt", "r")  # 文件可能不存在
        try:
            while True:
                content = file.readline()
                if len(content) == 0:
                    break
                strs += content
        finally:
            file.close()
    except FileNotFoundError as ex:
        print(ex)
        flag = False
        pass
    return strs, flag


# 写操作
def write(strs):
    f = open("copy.txt", "w")
    f.write(strs)
    f.close()

# 执行方法
try:
    strs, flag = read()
    write(strs)
    if flag:
        print("copy successfully")
    else:
        print("copy failure")
except Exception as ex:
    print(ex)
    pass

今日份的分享就到这里啦!🌹🌹🌹欢迎关注博主学习不迷路🌹🌹🌹!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。