Python学习笔记:18 文件读写和异常处理

本文介绍了Python中文件的打开、读写、追加、二进制模式以及异常处理和上下文管理。详细讲解了不同操作模式的使用,如'r'、'w'、'x'、'a',以及如何处理文件不存在或无法打开的异常。同时,文章涵盖了读写文本和二进制文件的方法,包括读取文件大小、文件复制以及读写CSV文件。最后,通过示例展示了如何利用with语句实现资源的自动释放,确保文件操作的正确性。
摘要由CSDN通过智能技术生成

打开和关闭文件

使用Python内置的open函数来打开文件,在使用open函数时,我们可以通过函数的参数指定文件名操作模式字符编码等信息,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件或二进制文件)以及做什么样的操作(读、写或追加),具体如下表所示。

操作模式具体含义
'r'读取 (默认)
'w'写入(会先截断之前的内容)
'x'写入,如果文件已经存在会产生异常
'a'追加,将内容写入到已有文件的末尾
'b'二进制模式
't'文本模式(默认)
'+'更新(既可以读又可以写)

下图展示了如何根据程序的需要来设置open函数的操作模式。

在使用open函数时,如果打开的文件是字符文件(文本文件),可以通过encoding参数来指定读写文件使用的字符编码。如果没有指定该参数,则使用系统默认的编码作为读写文件的编码。当前系统默认的编码可以通过下面的代码获得。

import sys

print(sys.getdefaultencoding())

结束文件操作时,需要使用文件对象的close方法释放这个文件。

读写文本文件

读取纯文本文件

file = open('致橡树.txt', 'r', encoding='utf-8')
print(file.read())
file.close()

如果要向文件中写入内容,可以在打开文件时使用w或者a作为操作模式,前者会截断之前的文本内容写入新的内容,后者是在原来内容的尾部追加新的内容。

file = open('resources/小雨康桥的诗.txt', 'w', encoding='utf-8')
file.write('我想做燕子\n')
    file.write('只需要简单想想\n')
    file.write('只求风中流浪\n')
    file.write('我想做树\n')
    file.write('不长六腑五脏\n')
    file.write('不会寸断肝肠\n')
file = open('resources/小雨康桥的诗.txt', 'a', encoding='utf-8')
    file.write('我做不成燕子\n')
    file.write('所以我飞不过感情的墙\n')
    file.write('我做不成树\n')
    file.write('因此也撑不破伤心的网\n')

异常处理机制

如果open函数指定的文件并不存在或者无法打开,那么将引发异常状况导致程序崩溃。为了让代码具有健壮性和容错性,我们可以使用Python的异常机制对可能在运行时发生状况的代码进行适当的处理。Python中和异常相关的关键字有五个,分别是tryexceptelsefinallyraise

file = open('D:\\python text\\致橡树.txt', 'r', encoding='utf-8')
try:
    data = file.read(32)
    while data:
        print(data, end='')
        data = file.read(32)
finally:
    file.close()

在Python中,我们可以将运行时会出现状况的代码放在try代码块中,在try后面可以跟上一个或多个except块来捕获异常并进行相应的处理。由于finally块的代码不论程序正常还是异常都会执行。

上面的代码中,read函数中的参数表示以多少个字节读取文件,通常这个参数必须是2的n次幂。

上下文语法

对于open函数返回的文件对象,还可以使用with上下文语法在文件操作完成后自动执行文件对象的close方法,这样可以让代码变得更加简单,在离开with上下文的时候,会自动关闭文件,无论是正常离开还是异常离开,因此不需要再写finally代码块来执行关闭文件释放资源的操作。

with open('resources/小雨康桥的诗.txt', 'a', encoding='utf-8') as file:
    file.write('我做不成燕子\n')
    file.write('所以我飞不过感情的墙\n')
    file.write('我做不成树\n')
    file.write('因此也撑不破伤心的网\n')

读写二进制文件

读写二进制文件跟读写文本文件的操作类似,但是需要注意,在使用open函数打开文件时,如果要进行读操作,操作模式是'rb',如果要进行写操作,操作模式是'wb'。还有一点,读写文本文件时,read方法的返回值以及write方法的参数是str对象(字符串),而读写二进制文件时,read方法的返回值以及write方法的参数是bytes-like对象(字节串)。

读取图片

file = open('D:\\Users\\Public\\Pictures\\travel\\aiwanting.jpg', 'rb')
# 移动文件指针到文件末尾
file.seek(0, 2)
# 通过tell可以获取到文件指针移动的字节数,这个字节数救赎文件的大小查看文件大小
print(file.tell())
# 将文件指针移动到文件最开始的位置
file.seek(0, 0)
try:
    data = file.read(512)
    while data:
        print(data, end='')
        data = file.read(512)
finally:
    file.close()

文件复制

def file_copy(source_file, target_file):
    with open(source_file, 'rb') as source_file:
        with open(target_file, 'wb') as target_file:
            data = source_file.read(512)
            while data:
                target_file.write(data)
                data = source_file.read(512)


if __name__ == '__main__':
    file_copy('resources/pavilion.jpg', 'resources/AiWan_pavilion.jpg')

读写CSV文件

读取CSV文件

import csv

with open('resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8') as file:
    # delimiter ---> 设置分隔符(默认是英文的逗号)
    # quotechar ---> 包裹字符串的字符(默认是英文的双引号)
    reader = csv.reader(file, delimiter=',', quotechar='"')
    for line in reader:
        print(line)

reader函数除了要传入读取的文件对象外,还可以通过delimiterquotechar参数来指定分隔符(默认是逗号)、包围值的字符(默认是双引号)。

将数据写入CSV文件

import csv

with open('resources/temperature.txt', 'r', encoding='utf-8') as file1:
    # newline ---> 默认是换行,因为写的时候已经是在每行写,因此把newline的值改为空,才不会产生多余的空行
    with open('resources/result.csv', 'w', encoding='utf-8', newline='') as file2:
        writer = csv.writer(file2)
        # writerow的方法参数是一个列表或一个元组(代表一行中所有的数据,默认用逗号分隔)
        writer.writerow(['id', 'temperature', 'info'])
        content = file1.readline()
        while content:
            no, temp = content.split()
            temp = float(temp)
            if temp >= 37.2:
                if temp <= 38.5:
                    info = '发热'
                else:
                    info = '高热'
                writer.writerow([no, temp, info])
            content = file1.readline()

temperature.txt文件中是病人编号与体温的信息,题目要求是将体温异常的病人选出来写入CSV文件中,其中温度范围在37.2到38.5之间为发热病人,温度高于38.5则为高热病人。

writerow函数表示写入一行数据,默认用逗号分隔,参数是一个列表或一个元组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

better meˇ:)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值