文件写入功能的权限被拒绝错误
Permission denied error on filewrite function
我写了一些代码来解析XML并将解析后的信息输出到两个文件中。然后我阅读这些文件并提交到带有请求 POST 模块的站点。当我尝试将上述 POST 的响应附加到文件时,我一直收到 PermissionError,[Errno 13] Permission Denied 错误(从第 112 行开始,下面发布的代码中的 submittoSite 函数)。
它发生的部分是这样的:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
responsefile.write(r.text + ", %d" % r.status_code + "\n")
当我只是直接按照功能编写文件时,为什么文件给我一个权限被拒绝的错误?我写入我正在解析 XML 的文件,结果并没有发生这种情况。它在函数的末尾。它不会尝试一次执行多个操作,例如线程,'with' 语句不会在完成后关闭文件吗?
在说 'write it to an array and then write it all to a file at once' 之类的话之前,我特别没有这样做,因为我正在进行 250k'ish POST 调用(我想要多线程的原因之一)并且我'我正在尝试降低 RAM。
Here's the full code (slightly edited due to work things)
注意:如果您阅读了代码并对线程的内容感到疑惑,我意识到其中的多线程内容现在是无关紧要的,但我仍然希望在某个时候我我会弄清楚如何在不相互干扰的情况下将其添加到 运行,即使我必须重写一些东西,所以我只是在处理这个的时候把它留在那儿。
Windows 不允许打开具有写访问权限的文件,如果它已经被另一个具有写访问权限的线程或进程打开,所以如果您的两个线程试图同时写入文件时间,其中之一将获得拒绝权限。
您应该在尝试使用写权限打开文件之前加锁:
from threading import Lock
def worker(lock):
with lock:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
responsefile.write(r.text + ", %d" % r.status_code + "\n")
if __name__ == '__main__':
lock = threading.Lock()
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(worker, lock)
将代码分成几个块以查看错误的来源。
让您最初提供的代码片段看起来像这样,而不是用于测试错误:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
foo = r.text + ", %d" % r.status_code + "\n"
print(foo)
responsefile.write("bar")
此外,查看完整代码后,问题似乎出在其他地方。测试用例:
import requests
import json
w = 'http://google.com'
r = requests.post(w)
foo = r.text
bar = r.status_code
baz = foo + ", %d" % bar + "\n"
with open('out.temp', 'a') as f:
f.write(baz)
我写了一些代码来解析XML并将解析后的信息输出到两个文件中。然后我阅读这些文件并提交到带有请求 POST 模块的站点。当我尝试将上述 POST 的响应附加到文件时,我一直收到 PermissionError,[Errno 13] Permission Denied 错误(从第 112 行开始,下面发布的代码中的 submittoSite 函数)。
它发生的部分是这样的:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
responsefile.write(r.text + ", %d" % r.status_code + "\n")
当我只是直接按照功能编写文件时,为什么文件给我一个权限被拒绝的错误?我写入我正在解析 XML 的文件,结果并没有发生这种情况。它在函数的末尾。它不会尝试一次执行多个操作,例如线程,'with' 语句不会在完成后关闭文件吗?
在说 'write it to an array and then write it all to a file at once' 之类的话之前,我特别没有这样做,因为我正在进行 250k'ish POST 调用(我想要多线程的原因之一)并且我'我正在尝试降低 RAM。
Here's the full code (slightly edited due to work things)
注意:如果您阅读了代码并对线程的内容感到疑惑,我意识到其中的多线程内容现在是无关紧要的,但我仍然希望在某个时候我我会弄清楚如何在不相互干扰的情况下将其添加到 运行,即使我必须重写一些东西,所以我只是在处理这个的时候把它留在那儿。
Windows 不允许打开具有写访问权限的文件,如果它已经被另一个具有写访问权限的线程或进程打开,所以如果您的两个线程试图同时写入文件时间,其中之一将获得拒绝权限。
您应该在尝试使用写权限打开文件之前加锁:
from threading import Lock
def worker(lock):
with lock:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
responsefile.write(r.text + ", %d" % r.status_code + "\n")
if __name__ == '__main__':
lock = threading.Lock()
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(worker, lock)
将代码分成几个块以查看错误的来源。 让您最初提供的代码片段看起来像这样,而不是用于测试错误:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
foo = r.text + ", %d" % r.status_code + "\n"
print(foo)
responsefile.write("bar")
此外,查看完整代码后,问题似乎出在其他地方。测试用例:
import requests
import json
w = 'http://google.com'
r = requests.post(w)
foo = r.text
bar = r.status_code
baz = foo + ", %d" % bar + "\n"
with open('out.temp', 'a') as f:
f.write(baz)