Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[技巧篇] 如何在不会的情况下解释 Python 设置文件的缓冲的问题

[技巧篇] 如何在不会的情况下解释 Python 设置文件的缓冲的问题

作者头像
编程文青李狗蛋
发布于 2019-09-17 08:19:28
发布于 2019-09-17 08:19:28
72100
代码可运行
举报
运行总次数:0
代码可运行

美好的中秋,朋友圈在享受悠闲周末的时候,刚入门 Python 的程序员小R在公司埋头加班,不知时间几何,一不小心把下周的工作捯饬完了,心情愉悦,不能自拔。

这不,周一的早上,小R吹着口哨,泡着枸杞,幻想着划水到飞起,嘴角抑制不住的咧到了耳朵根儿,翘起了二郎腿。

正抖腿抖到舒坦的时候,微信收到了一条消息,点开一看,消息来自一个熟悉又陌生的名字,在记忆的排水沟里使劲掏了掏,好不容易对号入座。一个许久未曾联系的同学小K,消息只有两个字:

“在吗?”

看着这两个字, 小R眉头一皱,发现事情

怎么回事?他这是要干嘛?为什么要问在吗?

是要借钱嘛?是要结婚嘛?是要...

挣扎良久,小R放下了二郎腿,按下了键盘:

“在”

此时心里已经在自导自演各种应对场景:

“要是借钱,我就...”

“要是结婚,我就...”

“....”

有一条消息过来,在它闪动的第24 次小R打开了聊天窗口:“听说你是 Python 大佬,我有一个问题想问你。”

嘿,吓死我了,你早说啊,此时小R内心一阵窃喜:“哎呀,我这么低调,竟然被人发现大佬的身份啦,看来我还要再低调一点,哈哈哈哈哈哈...”

低调的小R低调的在窗口敲下了如下内容:

“哎呀,没有啦,你有什么问题,随便问,没有我不会的。”

enter 一键发送。

小K:“太好了,Python 里面怎么设置文件的缓冲啊?”

小R:“....”

文件我懂,缓冲我懂,怎么设置,我哪知道怎么设置...

小K:“还在吗?”

好想说不在,当然认真负责的小R当然不会这样,有句伟大的“名言”怎么说的来着:自己的低调,跪着也要低调完...

于是,小R默默的打开了 Google...


00.文件的缓冲

如何设置文件的缓冲,先要知道什么是文件的缓冲

当我们将文件内容写入到硬件设备的时候,我们需要系统调用(系统调用也就是向操作系统申请一个服务,操作系统响应以后,帮助我们调用硬件的驱动程序)来完成写操作,这类操作我们也就是 I/O 操作。I/O 操作很耗时,为了提高效率,我们就要减少 I/O 操作的次数,我们使用的手段就是为文件设置一个缓冲区。

对于磁盘这种块设备,它的读写不是一个一个的字节,而是按“块”。假设一个“块”的大小是 4096 个字节,你写入一个字节,或者写入 4096 个字节,都需要一次 I/O 操作,设置缓冲区,当写入的数据不足一个“块”大小时,都放入到缓冲区当中,等凑够了一个“块”的数据量,再调用一次 I/O 操作,这样达到减少 I/O 操作的目的。

01.Python中文件对象的缓冲行为

文件的缓冲一般分为“全缓冲”、“行缓冲”、“无缓冲”。

“全缓冲”就是我在上面说的,缓冲区有一定大小,数据凑齐了这个大小就进行一次系统调用;“行缓冲”是在某些终端设备中上使用,碰到换行符进行一次系统调用;“无缓冲”是在一些不希望进行缓冲的设备上,比如串口设备,我们就需要及时把数据发送到串口上去。

下面我们就来看一下,在 Python 中默认的文件对象缓冲行为是怎样的。

首先我们创建一个 test.txt 的文件,以“只写”的形式打开:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = open('test.txt','w')

然后我们来观察一下文件中的内容(此时应该为空):

接下来我们向 test.txt 中写入一些内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = open('test.txt','w')
f.write('abc')

我们再来看一下文件中的内容:

仍然没有输出,这就意味着 “abc” 并没有真实的写入到磁盘中,而是进入到了缓冲区,其实到这你可以探测一下缓冲区的大小,通常一个“块”的大小为 4096 个字节,你可以尝试写入来试验,直到 tail -f test.txt 有内容显示为止。

这就是普通文件默认的缓冲行为,缓冲区的大小是根据平台和自身的属性相关的。在某些时候,我们需要改变缓冲区的大小,该怎么做呢?

其实很好解决:在 open 函数中,有个 buffering 参数,可以让这个问题迎刃而解。

我们将 buffering 设置为大于 1 的整数 n(n 为缓冲区的大小),这就是“全缓冲”;将 buffering 设置为 1,这就是“行缓冲”;将 buffering 设置为 0,这就是“无缓冲”。

接下来我们就尝试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = open('test1.txt','w',buffering=1024)
f.write('*'*512)

我们用同样的“只读”方式创建 test1.txt,设定缓冲区大小为 1024,我们先写入 512 个 “*”,接下来看一下文件的内容:

接下来我们就凑齐 1024 个字节:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = open('test1.txt','w',buffering=1024)
f.write('*'*512)
f.write('*'*511)
f.write('/')

此时文件的内容为:

这就全部输出出来了。

同理,对于“行缓冲”和“无缓冲”也是类似的操作,改变相应 buffering 的值即可,只是对于“行缓冲”,记得要写入换行符的时候才会在文件中显示出内容,感兴趣的可以尝试一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python文件处理入门篇
昨天分享了一个关于文件搜索的小实战项目,其实文件处理是Python里面非常重要的一块内容,知识点很多,Python对本地文件的处理,主要是通过文件的读和写来完成的。
stormwen
2019/08/05
4840
Python 基础(十二):文件基本操作
在编程工作中文件操作还是比较常见的,基本文件操作包括:创建、读、写、关闭等,Python 中内置了一些文件操作函数,我们使用 Python 操作文件还是很方便的。
Python小二
2020/08/18
5260
Python 基础(十二):文件基本操作
【Python】测试造数--文件 I/O操作
Python 提供了必要的函数和方法进行默认情况下的文件基本操作,可以使用 file 对象做大部分的文件操作。
用户9913368
2022/08/13
6560
【Python】测试造数--文件 I/O操作
python学习笔记(9)文件 I/O
Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。如下:
大数据小禅
2021/08/16
3990
python学习笔记(9)文件 I/O
【Python】Python读写文件操作
http://blog.csdn.net/adupt/article/details/4435615
py3study
2020/01/14
7660
Python file 方法
file object = open(file_name [, access_mode][, buffering])
py3study
2020/01/07
8020
小朋友学Python(17):文件
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 一、打开和关闭文件 例1 (1)创建名为test1.txt的文件,内容为 This is a test file. (2)在同一目录下新建file1.py文件,内容如下 file = open("test1.txt", "wb") print "File name: ", file.name print "Access mode: ", file.mode print "Closed or not
海天一树
2018/04/17
8900
python教程(八)·文件操作
由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解!
py3study
2020/01/16
5310
python读写文件
本文系海特网编程技术斑竹Cute所发表,版权归海特网与Cute所有,转载请保留完整信息
py3study
2020/01/10
1.8K0
python3–文件操作
File文件操作 Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。 open 函数 必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。 语法: file object = open(file_name [, access_mode][, buffering]) 各个参数的细节如下: file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。 access_mod
老七Linux
2018/05/09
1.2K0
超好懂的 Python 文件读写教程!
使用python读取一个txt文件的时候,相当于把这个文件从硬盘上,读取到了内存中。
用户6543014
2020/07/09
1.2K0
超好懂的 Python 文件读写教程!
Python 4 种不同的存取文件骚操作
前言:最近开始学习tensorflow框架,选修课让任选一种框架实现mnist手写数字的识别分类。小詹也就随着大流选择了 tf 框架,跟着教程边学边做,小詹用了不同的神经网络实现了识别分类,其中有一个步骤是将训练过程得到的模型进行保存,在之后的测试中加载并使用该模型。想到这种先保存再加载调用的过程,之前很多地方都遇到过呀,最简单常用的就是python中文件的存取哇!于是乎,小詹夜观星象,就着手整理记录各种文件存取的骚操作,具体如下。
小小詹同学
2018/07/24
1.5K0
Python 4 种不同的存取文件骚操作
【十】python基础之文件处理
给要打开的文件对象指定一个名字,这样可在完成操作之后迅速关闭文件,防止一些无用的文件对象占用内存
菲宇
2019/06/13
7320
【十】python基础之文件处理
Python3文件操作
产生输出的最简单方法是使用print语句,可以通过用逗号分隔零个或多个表达式。这个函数传递表达式转换为一个字符串,如下结果写到标准输出 -
py3study
2020/01/09
7740
python文件读写(open参数,文件
文件读写调用open函数打开一个文件描述符(描述符的个数在操作系统是定义好的) python3情况下读写文件:
py3study
2020/01/09
1.6K0
06 . Python3入门之IO编程(文件操作)
4. f.write() f.write(string)将string写入到文件中,然后返回写入的字符数.
iginkgo18
2020/09/27
8450
06 . Python3入门之IO编程(文件操作)
Python3 读写文件
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
py3study
2020/01/19
4.5K0
Python 文件I/O
最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下:
py3study
2020/01/10
8470
不可不知的三种缓冲类型
为什么有时候写入文件的内容却没有?没什么printf打印在终端的内容看不到?这一切背后有着怎样早为人知的秘密?
编程珠玑
2019/12/16
5940
不可不知的三种缓冲类型
Python文件操作
Python作为一种高效且易于学习的编程语言,提供了一系列强大的文件操作功能,使得用户能够轻松地实现文件的读取、写入和管理。本章将详细讲解文件的编码以及读取、写入和追加操作。
Heaven645
2024/07/25
2721
Python文件操作
相关推荐
Python文件处理入门篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验