千锋教育-做有情怀、有良心、有品质的职业教育机构

Python文件操作步骤示例

来源:千锋教育
发布时间:2023-11-05 19:45:35
分享

我们来读取这样一个文本文件:song.txt,该文件的字符编码为utf-8。

匆匆那年我们究竟说了几遍再见之后再拖延

可惜谁有没有爱过不是一场七情上面的雄辩

匆匆那年我们一时匆忙撂下难以承受的诺言

只有等别人兑现

1.菜鸟实现(只是实现功能):

python3实现:

#第一步:(以只读模式)打开文件

f=open('song.txt','r',encoding='utf-8')

#第二步:读取文件内容

print(f.read())

#第三步:关闭文件

f.close()

这里说下Python2的实现

#第一步:(以只读模式)打开文件

f=open('song.txt','r')

#第二步:读取文件内容

print(f.read().decode('utf-8'))

#第三步:关闭文件

f.close()

说明:

Python3中已经内置对Unicode的支持,字符串str已经是真正的Unicode字符串。也就是说Python3中的文件读取方法已经自动完成了解码处理,因此无需再手动进行解码,可以直接将读取的文件中的内容进行打印;Python2中的字符串str是字节串,读取文件得到的也是字节串,在打印之前应该手动将其解码成Unicode字符串。关于这部分的说明,可以参考之前这篇文章<<再谈Python中的字符串与字符编码>>。

2.中级实现

在实现基本功能的前提下,考虑一些可能的意外因素。因为文件读写时都有可能产生IO错误(IOError),一旦出错,后面包括f.close()在内的所有代码都不会执行了。因此我们要保证文件无论如何都能被关闭。那么可以用try...finally来实现,这实际上就是try...except..finally的简化版(我们只用Python3来进行示例演示):

f=''

try:

f=open('song.txt','r',encoding='utf-8')

print(f.read())

num=10/0

finally:

print('>>>>>>finally')

iff:

f.close()

输出结果:

匆匆那年我们究竟说了几遍再见之后再拖延

可惜谁有没有爱过不是一场七情上面的雄辩

匆匆那年我们一时匆忙撂下难以承受的诺言

只有等别人兑现

>>>>>>finally

Traceback(mostrecentcalllast):

File"",line4,in

ZeroDivisionError:divisionbyzero

输出结果说明,尽管with代码块中出现了异常,但是”>>>>>>finally“信息还是被打印了,说明finally代码块被执行,即文件关闭操作被执行。但是结果中错误信息还是被输出了,因此还是建议用一个完成的try...except...finally语句对异常信息进行捕获和处理。

3.最佳实践

为了避免忘记或者为了避免每次都要手动关闭文件,我们可以使用with语句(一种语法糖,语法糖语句通常是为了简化某些操作而设计的)。with语句会在其代码块执行完毕之后自动关闭文件。因此我们可以这样来改写上面的程序:

withopen('song.txt','r',encoding='utf-8')asf:

print(f.read())

print(f.closed)

输出结果:

匆匆那年我们究竟说了几遍再见之后再拖延

可惜谁有没有爱过不是一场七情上面的雄辩

匆匆那年我们一时匆忙撂下难以承受的诺言

只有等别人兑现

True

是不是变得简介多了,代码结构也比较清晰了。with之后打印的f.closed属性值为True,说明文件确实被关闭了。

思考:

with语句会帮我们自动处理异常信息吗?

要回答这个问题就要提到“上下文管理器”和with语句的工作流程。

with语句不仅仅可以用于文件操作,它实际上是一个很通用的结构,允许使用所谓的上下文管理器(contextmanager)。上下文管理器是一种支持__enter__()和__exit__()这两个方法的对象。__enter__()方法不带任何参数,它在进入with语句块的时候被调用,该方法的返回值会被赋值给as关键字之后的变量。__exit__()方法带有3个参数:type(异常类型),value(异常信息),trace(异常栈),当with语句的代码块执行完毕或执行过程中因为异常而被终止都会调用__exit__()方法。正常退出时该方法的3个参数都为None,异常退出时该方法的3个参数会被分别赋值。如果__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,命令执行结果中就不会抛出异常信息了;反之,如果__exit__()方法返回值(真值测试结果)为False,则表示异常没有被处理并且会向外抛出该异常。

现在我们应该明白了,异常信息会不会被处理是由with后的语句返回对象的__exit__()方法决定的。文件可以被用作上下文管理器。它的__enter__方法返回文件对象本身,__exit__方法会关闭文件并返回None。我们看下file类中关于这两个方法的实现:

def__enter__(self):#realsignatureunknown;restoredfrom__doc__

"""__enter__()->self."""

returnself

def__exit__(self,*excinfo):#realsignatureunknown;restoredfrom__doc__

"""__exit__(*excinfo)->None.Closesthefile."""

pass

可见,file类的__exit__()方法的返回值为None,None的真值测试结果为False,因此用于文件读写的with语句代码块中的异常信息还是会被抛出来,需要我们自己去捕获并处理。

withopen('song.txt','r',encoding='utf-8')asf:

print(f.read())

num=10/0

输出结果:

匆匆那年我们究竟说了几遍再见之后再拖延

可惜谁有没有爱过不是一场七情上面的雄辩

匆匆那年我们一时匆忙撂下难以承受的诺言

只有等别人兑现

Traceback(mostrecentcalllast):

File"",line3,in

ZeroDivisionError:divisionbyzero

注意:上面所说的__exit__()方法返回值(真值测试结果)为True则表示异常已经被处理,指的是with代码块中出现的异常。它对于with关键字之后的代码中出现的异常是不起作用的,因为还没有进入上下文管理器就已经发生异常了。因此,无论如何,还是建议在必要的时候在with语句外面套上一层try...except来捕获和处理异常。

有关“上下文管理器”这个强大且高级的特性的更多信息,请参看Python参考手册中的上下文管理器部分。或者可以在Python库参考中查看上下文管理器和contextlib部分。

以上内容为大家介绍了Python文件操作步骤示例,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • 用Python开发一个简单的猜数字游戏 本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所猜的数字与实际数字相比是“大(high)”还是“小(low)”,
  • 使用 Python 函数进行模块化 你是否对函数、类、方法、库和模块等花哨的编程术语感到困惑?你是否在与变量作用域斗争?无论你是自学成才的还是经过正式培训的程序员,代码的模块化都会令人困惑。但是类和库鼓励模块化代码,因为模块化代码意味着
  • Python语言自带的数据结构有哪些 Python作为一种脚本语言,其要求强制缩进,使其易读、美观,它的数据类型可以实现自动转换,而不需要像C、Java那样给变量定义数据类型,使其编写非常方便简单,所以广受大家的欢迎。现如今,Python
  • 用Python和Conu测试容器 越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。Conu(containerutilities的简写)是一个Python库,让你编写容器测试变得简单。本文向你介
  • Python循环应该怎么写? 说到处理循环,我们习惯使用for,while等,比如依次打印每个列表中的字符:lis=[&#39;I&#39;,&#39;love&#39;,&#39;python&#39;]foriinlis:pr
  • 优化 Python 程序的内存占用 Python的垃圾回收机制通过引用计数来决定一个对象要不要被回收。当一个对象被引用次数为0时,它就会被作为垃圾回收从而释放Python内存。但有些情况下,我们的代码可能在不经意间导致某些实际上我们不再