我创建了一个简单的文本文件并使用检查其时间戳stat
,以下是输出:
stat 在任何 python 脚本之前输出
papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt
File: prac09_timestamp.txt
Size: 10 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 2485542 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/papagolf) Gid: ( 1001/papagolf)
Access: 2017-09-10 11:10:40.979845492 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
Birth: -
然后我运行了一个 python 脚本,它只是以读取模式打开文件。我原以为“访问”时间标记会改变,但事实并非如此。
Python 脚本和运行后 stat 的输出
papagolf@Sierra ~/My Files/My Programs/Learning/Python % cat python prac09_timestamp.py
cat: python: No such file or directory
a = open("prac09_timestamp.txt", "r")
a.close()
papagolf@Sierra ~/My Files/My Programs/Learning/Python % python prac09_timestamp.py
papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt
File: prac09_timestamp.txt
Size: 10 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 2485542 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/papagolf) Gid: ( 1001/papagolf)
Access: 2017-09-10 11:10:40.979845492 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
Birth: -
但是当我更改脚本以实际读取数据时,时间戳发生了变化。你能解释一下吗?
新的 Python 脚本和运行后 stat 的输出
papagolf@Sierra ~/My Files/My Programs/Learning/Python % cat prac09_timestamp.py
a = open("prac09_timestamp.txt", "r")
a.readlines()
a.close()
papagolf@Sierra ~/My Files/My Programs/Learning/Python % python prac09_timestamp.py
papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt
File: prac09_timestamp.txt
Size: 10 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 2485542 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/papagolf) Gid: ( 1001/papagolf)
Access: 2017-09-10 11:13:12.699848321 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
Birth: -
答案1
我认为这根本不是一个Python问题。这是系统级别的。在这个级别上,打开文件与读取文件是完全不同的操作。我并不是 Linux 内部结构方面的专家,但这里有一些基本事实:
- 文件用以下命令打开
open()
系统调用。 - 读取文件时使用
read()
系统调用 - 有一个标志
open()
指示系统不更新访问时间什么时候read()
被调用。它被称为O_NOATIME
- 您可以由此推断
open()
本身不会更新访问时间
如果你想什么使用权意味着这是有道理的。open()
仅返回一个文件描述符,该描述符允许您稍后对关联文件执行某些操作(读取和/或写入)。用一个粗略的比喻来说,这就像拥有一张音乐会门票。在你出现并开始摇滚之前,你实际上还没有访问过任何东西。 ;)