Попытка использовать open (имя файла, 'w') дает IOError: [Errno 2] Нет такого файла или каталога:

Я пытаюсь создать и записать в текстовый файл Maya с помощью Python. Версия Python в этой версии Maya - 2.7.3. Я искал и не могу найти решение/причину этой ошибки.

Здесь код, который не работает.

afile = 'D:\\temp\\test.txt'
outFile = open( afile, 'w' )
outFile.write('Test.')
outFile.close()

# Error: 2
# Traceback (most recent call last):
#   File "<maya console>", line 1, in <module>
# IOError: [Errno 2] No such file or directory: 'D:\\temp\\test.txt' #

Большинство ответов, которые я нашел, связаны с косой чертой в пути, поэтому...

I tried 'D:/temp/test.txt' and got an error.
I tried r'D:\temp\test.txt' and got an error.

Когда я пытаюсь создать файл в корне D:/У меня есть успех.

'D:/test.txt' works.
'D:\\test.txt' works.
r'D:\test.txt' works.

Кажется, что я не могу создать путь к каталогу, который я хотел бы при попытке создать файл. Каков правильный метод для создания файлов по определенному пути с помощью Python в Windows (7)? Неужели я не понимаю, что может сделать open()? Создает ли он каталоги, если они не существуют или мне нужно явно создать путь к каталогу, прежде чем я буду использовать open() в режиме "write" для создания файла?

Ответы

Ответ 1

Вы правы в предположении, что родительский каталог для файла должен существовать для успешного завершения open. Простым способом справиться с этим является обращение к os.makedirs.

В документации :

os.makedirs(путь [, режим])

Рекурсивная функция создания каталога. Подобно mkdir(), но делает все каталоги промежуточного уровня необходимыми для хранения листового каталога.

Таким образом, ваш код может работать примерно так:

filename = ...
dirname = os.path.dirname(filename)
if not os.path.exists(dirname):
    os.makedirs(dirname)
with open(filename, 'w'):
    ...

Ответ 2

Если вы попытаетесь создать файл в директории, которая не существует, вы получите эту ошибку.

Вам необходимо убедиться, что каталог существует первым. Вы можете сделать это с помощью os.makedirs() в соответствии с этим ответом.

Ответ 3

В качестве альтернативы вы можете проверить, существует ли файл перед его открытием:

os.path.exists (afile)

Который либо скажет True, либо False, в зависимости от того, существует ли он.