gpt4 book ai didi

python在windows上非阻塞读取文件

转载 作者:可可西里 更新时间:2023-11-01 13:42:26 29 4
gpt4 key购买 nike

我在 Windows (Win7) 上有一个程序,每 x 秒写入一个 txt 文件。现在我有一个 python 脚本,每 x 秒读取一次这个 txt 文件。当 python 脚本读取文件并且同时另一个程序想要写入该文件时 - 写入程序崩溃(并显示权限错误)。由于我无法修改程序写入 txt 文件的方式,因此我必须尝试在不阻止写入程序的情况下打开 txt 文件。有人知道在这种情况下我能做什么吗(无障碍阅读)我会很高兴收到有关此主题的每条提示!

尝试读取文件的程序代码如下所示:

    with codecs.open(datapath, "r", 'utf-16') as raw_data:

raw_data_x = raw_data.readlines()

我必须用“编解码器”打开文件,因为它是 unicode。

最佳答案

很长一段时间后,我设法在 ctypes 中创建了一个函数来为您完成它。请记住,这仅在进程未获得“独占”访问权限时才有效。如果是这样,那你就倒霉了,需要使用如图所示的卷影复制服务 here或实现 here .
不管怎样,给你:

import ctypes
from ctypes import wintypes
import os
import msvcrt

GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000

OPEN_EXISTING = 3
OPEN_ALWAYS = 4

ACCESS_MODES = {
"r": GENERIC_READ,
"w": GENERIC_WRITE,
"r+": (GENERIC_READ|GENERIC_WRITE)
}

OPEN_MODES = {
"r": OPEN_EXISTING,
"w": OPEN_ALWAYS,
"r+": OPEN_ALWAYS,
}


def open_file_nonblocking(filename, access):
# Removes the b for binary access.
internal_access = access.replace("b", "")
access_mode = ACCESS_MODES[internal_access]
open_mode = OPEN_MODES[internal_access]
handle = wintypes.HANDLE(ctypes.windll.kernel32.CreateFileW(
wintypes.LPWSTR(filename),
wintypes.DWORD(access_mode),
wintypes.DWORD(2|1), # File share read and write
ctypes.c_void_p(0),
wintypes.DWORD(open_mode),
wintypes.DWORD(0),
wintypes.HANDLE(0)
))

try:
fd = msvcrt.open_osfhandle(handle.value, 0)
except OverflowError as exc:
# Python 3.X
raise OSError("Failed to open file.") from None
# Python 2
# raise OSError("Failed to open file.")

return os.fdopen(fd, access)

该函数在共享读写句柄的同时打开文件,允许多次访问。然后它将句柄转换为普通的 Python 文件对象。
确保在完成后关闭文件。

关于python在windows上非阻塞读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163715/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com