一日一技:print函数也能写文件

简介: 一日一技:print函数也能写文件

在Python里面,当我们要把一段字符串写入到一个文件里面时,我们会这样写:

with open('text.txt', 'w', encoding='utf-8') as f:
    f.write('我是一段文本')

或者有人不习惯 with上下文管理,可能会这样写代码:

f = open('text.txt', 'w', encoding='utf-8')
f.write('我是一段文本')
f.close()

如果我们的代码需要在多个地方写文件,那么每次使用上下文管理确实稍显费时间。

虽然也可以把写文件的操作封装到一个函数里面,不过实际上Python 3的 print函数就能够直接写文件:

f = open('text.txt', 'w', encoding='utf-8')
print('我是一段字符串', file=f)
print('我是第二段内容', file=f)
print('我是第三段内容', file=f)
f.close()

运行效果如下图所示。

这个时候可能有人会说,你这样确实写到文件里面了,可是屏幕上又不显示了啊。我想既在屏幕上显示,又写入文件怎么做呢?

print函数的 file参数,可以接受任何一个带有 write方法的对象。所以我们可以写一个既打印在屏幕,又写入文件的类:

class print_and_write:
    def __init__(self, file_name):
        self.f = open(file_name, 'w', encoding='utf-8')
    def write(self, text):
        print(text)
        self.f.write(text)
    def close(self):
        self.f.close()
f = print_and_write('text.txt')
print('第一段', file=f)
print('第二段', file=f)
print('第三段', file=f)

运行效果如下图所示。

这个时候,有人会问,你写了这么大一堆,我用一个函数3行代码就能搞定:

def print_and_write(file_name, text):
    print(text)
    with open(file_name, 'a', encoding='utf-8') as f:
        f.write(text)

那么你这种方式与我通过函数来实现的方式有什么区别?

我认为,最主要的区别在于扩展性。当你定义一个函数来既显示到屏幕上,又写入文件的时候。如果现在希望把这个内容再发送到一个HTTP服务中,那么你就需要修改这个函数。随着需求量的增大,你这个函数会越来越复杂。你不得不在这个函数里面调用更多的函数来分离各个功能。

那么,新的这些函数应该如何管理?

而当我使用一个含有 write方法的类,并配合 print函数的 file关键字来实现这个功能的时候,我可以通过这个类把相关的功能全部整合起来,封装成一个专门的模块,从而隐藏调用的细节。对外暴露的只有这个print_and_write对象的实例,而不需要额外写出它的任何方法。

而在代码的调用层,能够看到的就是带有 file关键字的 print函数,这样代码会显得非常简洁。

目录
相关文章
|
数据可视化 数据挖掘
【因果推断】Day01- 实用计量方法图解与概述
【因果推断】Day01- 实用计量方法图解与概述
459 2
|
存储 Linux 芯片
【启动】芯片启动过程全解析
【启动】芯片启动过程全解析
385 0
|
自然语言处理 Linux 芯片
实践经验分享:以太网MAC和PHY层问题的解决方案
实践经验分享:以太网MAC和PHY层问题的解决方案
|
JavaScript C# 开发工具
20款VS Code实用插件推荐
20款VS Code实用插件推荐
441 0
|
Python
pandas中groupby和shift结合实现相邻行的计算
pandas中groupby和shift结合实现相邻行的计算
307 0
|
测试技术 开发工具 芯片
Open Chip Community (OCC)
Open Chip Community (OCC) 是一个开源芯片社区,旨在推动开源芯片的发展和普及。OCC 的目标是为开发人员提供一个开放透明的平台,让他们可以共同协作、创新和分享开源芯片技术。
934 3
|
Python
Python中的逻辑运算符:且(and)与或(or)
Python中的逻辑运算符:且(and)与或(or)
5557 0
|
关系型数据库 数据安全/隐私保护
python-matplotlib给图像添加文本标签与注释
python-matplotlib给图像添加文本标签与注释
1570 0
python-matplotlib给图像添加文本标签与注释