栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python中truncate(0)之后文件中的垃圾

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python中truncate(0)之后文件中的垃圾

这是因为截断不会更改流的位置。

当你

read()
的文件,你移动位置到结束。因此,连续的
write
s将从该位置写入文件。
但是,当您调用时
flush()
,似乎不仅尝试将缓冲区写入文件,而且还会进行一些错误检查并修复当前文件位置。在
Flush()
之后调用时
truncate(0)
,将不写入任何内容(缓冲区为空),然后检查文件大小并将该位置放置在第一个适用的位置(即
0
)。

更新

Python的文件功能不仅是与C标准库等效物的包装,而且了解C函数有助于更准确地了解正在发生的事情。

在ftruncate手册页中:

调用ftruncate()不会修改seek指针的值。

从笨拙的手册页:

如果流指向输入了最新操作的输入流或更新流,则在可搜索且尚未到达文件末尾的情况下刷新该流。刷新输入流将丢弃所有缓冲的输入,并调整文件指针,以使下一个输入操作在最后一次读取后访问该字节。

这意味着如果您放置

flush
truncate
它之前没有效果。我检查了,是这样。

但是为了

flush
追求
truncate

如果流指向未输入最新操作的输出流或更新流,则fflush()会将该流的任何未写入数据写入文件,并标记基础文件的st_ctime和st_mtime字段进行更新。

手册页在解释未输入最后操作的输出流时没有提及查找指针。(这是我们的最后一个操作是

truncate

更新2

我在python源代码中找到了一些东西:

Python-3.2.2Modules_iofileio.c:837

#ifdef HAVE_FTRUNCATEstatic PyObject *fileio_truncate(fileio *self, PyObject *args){    PyObject *posobj = NULL; #ifndef MS_WINDOWS    Py_off_t pos;#endif...#ifdef MS_WINDOWS        {        PyObject *oldposobj, *tempposobj;        HANDLE hFile;////// THIS LINE //////////////////////////////////////////////////////////////                oldposobj = portable_lseek(fd, NULL, 1);        if (oldposobj == NULL) { Py_DECREF(posobj); return NULL;        }                ...                ...////// AND THIS LINE //////////////////////////////////////////////////////////                tempposobj = portable_lseek(fd, oldposobj, 0);        Py_DECREF(oldposobj);        if (tempposobj == NULL) { Py_DECREF(posobj); return NULL;        }        Py_DECREF(tempposobj);    }#else...#endif 

查看我指示的两行(

///// This Line /////
)。如果您的平台是Windows,则它将保存位置并在截断后将其返回。

令我惊讶的是,

flush
Python
3.2.2函数中的大多数函数什么都不做,或者根本没有调用
fflush
C函数。3.2.2截短部分也没有记录。但是,我确实在Python
2.7.2源中发现了一些有趣的东西。首先,我
Python-2.7.2Objectsfileobject.c:812
truncate
实现中发现了这一点:

 

因此,总而言之,我认为这是完全依赖平台的事情。我检查了适用于Windows x64的默认Python 3.2.2,并获得了与您相同的结果。不知道在*
nixes上会发生什么。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/668582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号