【问题标题】:Prevent a file from being opened防止文件被打开
【发布时间】:2010-12-13 10:36:11
【问题描述】:

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

  1. 打开文件
  2. 附加数据
  3. 关闭文件(我认为这是保存更改所必需的,以确保每次日志记录后的安全。)

问题
该文件可以通过 Windows 资源管理器访问(我使用的是 XP)。如果文件在 Excel 中打开,则 Excel 会锁定对它的访问。当脚本尝试追加数据时,显然它失败了,然后它就完全中止了。

目标:
有没有办法使用 Python 锁定文件,以便对它的任何访问仍然是脚本独有的?或者我的方法一开始就很糟糕?

【问题讨论】:

标签: python logging file-locking


【解决方案1】:

而不是在每次访问后关闭并重新打开文件,只需刷新其缓冲区:

theloggingfile.flush()

这样,在 Python 中保持打开状态以便写入,这应该会锁定文件以防止其他程序打开它进行写入。我认为当 Excel 在 Python 中打开时,它能够以只读方式打开它,但如果不重新启动到 Windows,我无法检查它。

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

os.fsync(theloggingfile.fileno())

【讨论】:

  • -1 因为即使答案说的是真的,它也没有解决所提出的问题。问题是关于文件锁定而不是将文件缓冲区同步到磁盘。
  • @Bryan:但如果他保持打开状态进行写作,我认为应该锁定它。从而达到他想要的。
  • +1 他谈到了最后一部分“......我的方法首先很差......”
  • @Kit:您可能想检查它是否按预期工作——我不在 Windows 上,所以我无法测试它。我认为,虽然文件是用 Python 打开的,但 Excel 应该以只读方式打开它。
  • @Thomas K:我认为如果你在你的评论中输入你的答案(关于如何保持打开有效地锁定它)你的答案将是一个更好的答案,而且我不仅删除downvote,我会添加upvote。不要让读者从字里行间来理解你的观点。
【解决方案2】:

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

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

您可能想先尝试写入一个临时文件(Excel 不知道的文件),然后再用它替换原始文件。

【讨论】:

  • 可以做到,但不知道怎么做。例如,~/ntuser.dat(或其他任何名称)被锁定,无法读取。
  • @Chris:这不是因为权限而不是锁定吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多