Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻止打开文件_Python_Logging_File Locking - Fatal编程技术网

Python 阻止打开文件

Python 阻止打开文件,python,logging,file-locking,Python,Logging,File Locking,我正在编写一个Python logger脚本,它以以下方式写入CSV文件: 打开文件 附加数据 关闭文件我认为这是保存更改所必需的,以确保在每次日志记录例程之后的安全。 问题: 该文件非常容易通过Windows资源管理器访问,我正在使用XP。如果文件是在Excel中打开的,Excel将锁定对该文件的访问。当脚本尝试追加数据时,显然它失败了,然后它完全中止 目标: 有没有一种方法可以使用Python锁定一个文件,这样对它的任何访问都是脚本独占的?或者也许我的方法一开始就很糟糕?据我所知,Windo

我正在编写一个Python logger脚本,它以以下方式写入CSV文件:

打开文件 附加数据 关闭文件我认为这是保存更改所必需的,以确保在每次日志记录例程之后的安全。 问题: 该文件非常容易通过Windows资源管理器访问,我正在使用XP。如果文件是在Excel中打开的,Excel将锁定对该文件的访问。当脚本尝试追加数据时,显然它失败了,然后它完全中止

目标:
有没有一种方法可以使用Python锁定一个文件,这样对它的任何访问都是脚本独占的?或者也许我的方法一开始就很糟糕?

据我所知,Windows不支持文件锁定。换句话说,无法阻止不知道文件被锁定的应用程序读取文件

但剩下的问题是:Excel如何做到这一点


您可能希望先尝试写入Excel不知道的临时文件,然后用它替换原始文件。

据我所知,Windows不支持文件锁定。换句话说,无法阻止不知道文件被锁定的应用程序读取文件

但剩下的问题是:Excel如何做到这一点


您可能希望先尝试写入Excel不知道的临时文件,然后用它替换原始文件。

每次访问后,不要关闭并重新打开该文件,只需刷新其缓冲区即可:

theloggingfile.flush()
这样,您就可以在Python中保持该文件的打开状态,这样就可以从其他打开该文件进行写入的程序中锁定该文件。我认为Excel在Python中打开时可以以只读方式打开它,但如果不重新启动到Windows中,我无法检查这一点

编辑:我认为你不需要下面的步骤。flush应该将它发送到操作系统,如果您试图在另一个程序中查看它,操作系统应该为它提供缓存版本。使用os.fsync强制操作系统将其写入硬盘,例如,如果您担心突然断电

os.fsync(theloggingfile.fileno())

与其在每次访问后关闭并重新打开文件,不如刷新其缓冲区:

theloggingfile.flush()
这样,您就可以在Python中保持该文件的打开状态,这样就可以从其他打开该文件进行写入的程序中锁定该文件。我认为Excel在Python中打开时可以以只读方式打开它,但如果不重新启动到Windows中,我无法检查这一点

编辑:我认为你不需要下面的步骤。flush应该将它发送到操作系统,如果您试图在另一个程序中查看它,操作系统应该为它提供缓存版本。使用os.fsync强制操作系统将其写入硬盘,例如,如果您担心突然断电

os.fsync(theloggingfile.fileno())

这是可以做到的,但我不知道怎么做。例如,~/ntuser.dat或它的任何名称被锁定,无法读取。@克里斯:这不是因为权限而不是锁定吗?这是可以做到的,但我不确定如何做到。例如,~/ntuser.dat或它的任何名称被锁定且无法读取。@克里斯:这不是因为权限而不是锁定吗?其他问题的答案可能重复需要额外的模块。我在下面选择的答案通过内置功能解决了这个问题。其他问题的答案可能重复需要额外的模块。我在下面选择的答案解决了内置功能的问题。-1因为,即使答案所说的是正确的,它也没有解决所提出的问题。问题是关于文件锁定,而不是将文件缓冲区同步到磁盘。@Bryan:但如果他保持文件打开以便写入,我认为应该锁定它。因此实现了他想要的。+1他谈到了最后一部分,其中说……首先,我的方法很糟糕……@Kit:你可能需要检查它是否如你所期望的那样工作——我不在Windows上,所以我无法测试它。我认为,当文件用Python打开时,Excel应该以只读方式打开它。@Thomas K:我认为如果你在答案中加入你在评论中关于如何保持打开状态有效地锁定它的内容,那么你的答案将是一个更好的答案,我不仅会删除反对票,还会添加一个反对票。不要让读者通过字里行间的阅读来理解你的观点。-1因为,即使答案说的是真的,它也不能解决被问到的问题。问题是关于文件锁定,而不是将文件缓冲区同步到磁盘。@Bryan:但如果他保持文件打开以便写入,我认为应该锁定它。因此实现了他想要的。+1他谈到了最后一部分,其中说……首先,我的方法很糟糕……@Kit:你可能需要检查它是否如你所期望的那样工作——我不在Windows上,所以我无法测试它。我认为,当文件用Python打开时,Excel应该以只读方式打开它。@Thomas K:我认为如果你在答案中加入你在评论中关于如何保持打开状态有效地锁定它的内容,你的答案会更好,我不仅会删除 如果投反对票,我再投赞成票。不要让读者通过字里行间的阅读来理解你的观点。