Ошибка «Отказано в доступе» для функции filewrite - PullRequest
0 голосов
/ 27 августа 2018

Я написал некоторый код для разбора XML и вывода проанализированной информации в два файла.Затем я читаю эти файлы и отправляю на сайт с запросами модуль POST.Когда я пытаюсь добавить ответ от указанного POST в файл, я получаю PermissionError, [Errno 13] Ошибка «Отказано в доступе» (из строки 112, функция submittoSite в приведенном ниже коде).

Разделэто происходит так:

with open(xmfp + "nsresponse.csv", "a") as responsefile:
    responsefile.write(r.text + ", %d" % r.status_code + "\n")  

Почему файл дает мне ошибку «Отказано в разрешении», когда я пишу его только в соответствии с функцией?Я пишу в файлы, которые я разбираю в XML, и этого не происходит.Это в конце функции.Он не пытается делать больше, чем по одному, например, многопоточность, и оператор «with» не закрывает файл после того, как это будет сделано?

Прежде чем сказать что-то вроде «записать его в массив, а затем записатьвсе это сразу в файл », я специально этого не делаю, потому что я выполняю 250 тыс. запросов POST (одна из причин, по которой я хотел многопоточность) и пытаюсь уменьшить объем оперативной памяти.

Вот полный код (слегка отредактированный из-за работы)

ПРИМЕЧАНИЕ. Если вы прочитали код и задаетесь вопросом о многопоточности, я понимаю, чтомногопоточность там уже посторонняя, но я все еще надеюсь, что в какой-то момент я пойму, как заставить ее работать, не мешая друг другу, даже если мне придется переписывать вещи, так что я просто ухожупока я работаю над этим.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Разделите код на несколько блоков, чтобы увидеть, откуда исходит ошибка.Позвольте вашему фрагменту кода, который вы первоначально предоставили, выглядеть для проверки ошибки следующим образом:

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)
0 голосов
/ 27 августа 2018

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)
...