我写了一些代码来解析XML,并将解析的信息输出到两个文件中。然后,我读取这些文件并提交到带有请求POST模块的站点。当我尝试将上述POST的响应附加到文件时,我一直在接收到PermissionError,[Errno 13] Permission Denied错误(来自下面代码中的committoSite函数第112行)。
因此正在发生的部分是:
with open(xmfp + "nsresponse.csv", "a") as responsefile:
responsefile.write(r.text + ", %d" % r.status_code + "\n")
当我仅直接在函数中编写文件时,为什么文件给我一个拒绝权限错误?我写入要解析XML的文件,但这不会发生。它在函数的末尾。它不会像线程那样一次尝试执行多个操作,并且一旦完成,“ with”语句是否不会关闭文件?
在说类似“将其写入数组然后一次将其全部写入文件”之类的内容之前,我没有这样做,因为我正在进行250k的POST调用(我想这样做的原因之一)多线程),而我试图保持RAM不变。
Here's the full code (slightly edited due to work things)
注意:如果您已经阅读了代码并且对线程问题感到疑惑,那么我现在意识到其中存在多线程问题,但是我仍然希望在某个时候我能弄清楚即使我不得不重写某些东西,也可以使它们运行而又不会彼此干扰,所以在进行此工作时,我只是将其保留在那里。
答案 0 :(得分:1)
将代码分成几个块,以查看错误的出处。 让您最初提供的代码片段看起来像这样,以测试错误:
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)
答案 1 :(得分:0)
如果另一个线程或具有写访问权的进程已经打开了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)