一日一技: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函数,这样代码会显得非常简洁。

目录
相关文章
|
1月前
|
IDE Java Shell
聊聊 print 的前世今生
聊聊 print 的前世今生
36 1
|
2天前
|
JSON 数据格式 索引
Python内置函数如`print()`输出信息,`len()`计算长度
【6月更文挑战第23天】Python内置函数如`print()`输出信息,`len()`计算长度,`type()`识别类型,`range()`生成序列,`sum()`求和,`min()`和`max()`找极值,`abs()`取绝对值,`round()`四舍五入,`sorted()`排序,`zip()`和`enumerate()`组合及遍历,`map()`和`filter()`应用函数。标准库如`os`用于操作系统交互,`sys`处理解释器信息,`math`提供数学运算,`re`支持正则表达式,`json`处理JSON数据。学习这些能提升编程效率。
10 5
|
7月前
|
移动开发 Python
“ \r “导致print打印被覆盖
“ \r “导致print打印被覆盖
69 0
Python print() 打印两个 list ,实现中间换行
Python print() 打印两个 list ,实现中间换行
|
9月前
|
Python
Python输出函数print
Python输出函数print
35 0
echo 、print 及print_r() 、var_dump()的区别
echo 、print 及print_r() 、var_dump()的区别
62 0
|
机器学习/深度学习 Python
python中print参数sep和end 输出中的奥秘!
python中print参数sep和end 输出中的奥秘!
120 0
|
存储 Java C语言
【python】输入以及print()函数的三种输出方式
【python】输入以及print()函数的三种输出方式
289 0
【python】输入以及print()函数的三种输出方式
print 方法输出
print 方法输出
111 0
print 方法输出