Почему я получаю Python IOError: [Errno 13] Отказано в разрешении на запись в файл? - PullRequest
0 голосов
/ 05 февраля 2019

Я не могу понять, что я делаю неправильно.Я запускаю несколько тестов и записываю результаты в файл.Часть кода, которая записывает в файл, выглядит следующим образом (в классе с именем Tester):

 @staticmethod
 def printHeader(resultsFileName):
        if not os.path.isfile(resultsFileName):
            # The file does not exist, thus
            # we need to print the header

            # Opens the results file
            with open(resultsFileName,"a") as file:
                # Prints the header 
                file.write("A long header")


@staticmethod
def printResults(resultsFileName,otherArguments):

    # Prints the header if it does not exist
    Tester.printHeader(resultsFileName)

    # Prints the results
    with open(resultsFileName,"a") as file:

        file.write(otherArguments)

Иногда я получаю эту ошибку:

Traceback (most recent call last):
  File "main.py", line 74, in <module>
  File "tester.py", line 88, in methodOne
  File "tester.py", line 441, in printResults
  File "tester.py", line 428, in printHeader
IOError: [Errno 13] Permission denied: 'results.txt'

, в то время как в других случаях она выполняетсяплавно.Я не могу понять, где проблема.Есть идеи?

NOTE1 : У меня есть разрешение rwx на каталог, в который записан файл. NOTE2 : ошибка возникает после того, как несколько строк результатов уже записаны.Таким образом, это происходит, когда код проверяет, должен ли печататься заголовок или нет (но он не должен печатать его, поскольку файл существует).

ОБНОВЛЕНИЕ 1 :

Как и предполагалось, я изменил свой код, чтобы избежать многократного открытия и закрытия файла.Теперь он пишет все в одном кадре.Это обновленный код:

  @staticmethod
  def printResults(resultsFileName,otherArguments):

    # Prints the header if it does not exist                                                                                                                                                                                                                                                                                                                            
    if not os.path.exists(resultsFileName):

        # The file does not exist, thus                                                                                                                                                                                                                                                                                                                                 
        # we need to print the header                                                                                                                                                                                                                                                                                                                                   

        # Opens the results file               
        # HERE IS WHERE ERRNO 13 HAPPENS
        # STRANGELY, THE FILE DOES EXIST 
        # AS SEVERAL LINES OF RESULTS 
        # HAVE ALREADY BEEN WRITTEN                                                                                                                                                                                                                                                                           
        with open(resultsFileName,"w") as file:

            # Prints the header                                                                                                                                                                                                                                                                                                                                         
            file.write("A suitable header")
            # Prints the results                                                                                                                                                                                                                                                                                                                                        
            file.write(otherArguments)
    else:

        # Prints the results                                                                                                                                                                                                                                                                                                                                            
        with open(resultsFileName,"a") as file:
            file.write(otherArguments)   

Кажется, что os.path.exists() в какой-то момент возвращает FALSE, даже если файл существует.Возможно, что-то отозвало мне разрешение на запись (возможно, файл неправильно закрыт после записи?).

В объяснении os.path.exists() говорится, что:

На некоторых платформах эта функция может возвращать False, если не предоставлено разрешение на выполнение os.stat () для запрошенного файла,даже если путь физически существует.

ОБНОВЛЕНИЕ 2

Я изменил свой код на следующий, чтобы избежать os.path.isfile():

# Opens the results file                                                                                                                                                                            
with open(resultsFileName,"a") as file:
     if file.tell() == 0:
         # Prints the header                                                                                                                                                                         
         file.write("Header")
         # Prints the results                                                                                                                                                                        
         file.write(otherArguments)
         file.close()
      else:

         # Prints the results
         file.write(otherArguments)                                                                                                                                                                        
         file.close()

Тем не менее, ERRNO 13 происходит в with open(resultsFileName,"a") as file:.У меня есть права доступа rw как к папке, так и к файлу, на котором написано несколько строк, прежде чем произойдет ошибка.ОС Linux.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

os.path.isfile(path) возвращает True, если path существует И является файлом И у вас есть (по крайней мере) права на чтение для него.IOW, он возвращает False, если path существует, но является каталогом и / или у вас нет разрешений на него.Таким образом, ваш тест неверен с самого начала - os.path.exists() будет лучшим выбором.Но в любом случае: эти операции не являются атомарными, поэтому файл вполне может быть создан между моментом, когда вы проверяете его существование, и моментом, когда вы пытаетесь открыть его, поэтому весь дизайн на самом деле небезопасен.Кроме того, указание, открытие и закрытие файла - все это дорогостоящие операции, поэтому я предлагаю - если возможно - переосмыслить весь свой дизайн, чтобы открыть файл только один раз и только один раз закрыть его, когда вы закончите.

0 голосов
/ 05 февраля 2019
  1. Попробуйте закрыть файл result.txt перед запуском программы (я бы его открыл).

  2. Проверьте права на запись.

  3. Другой причиной может быть запись в TXT-файл в каталоге без этих разрешений.Попробуйте запустить python из указанного каталога.

...