Py4*_*y42 6 python windows windows-7
我在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()
Run Code Online (Sandbox Code Playgroud)
我必须使用“编解码器”打开文件,因为它是unicode。
很长一段时间后,我设法在 ctypes 中创建了一个为您执行此操作的函数。请记住,这仅在进程未获得“独占”访问权限时才有效。如果是这样,那么您就不走运了,需要使用此处显示或此处实现的卷影复制服务。
无论如何,给你:
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)
Run Code Online (Sandbox Code Playgroud)
该函数在共享读写句柄的同时打开文件,允许多次访问。然后它将句柄转换为普通的 python 文件对象。
完成后确保关闭文件。
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |