Цель состоит в том, чтобы посмотреть в json файл в каталоге выше скрипта и загрузить то, что он находит в этом файле. Это то, что у меня есть:
import os
import json
settings_file = '/home/me/foo/bar.txt'
root = os.path.dirname(os.path.dirname(os.path.abspath(settings_file))) # '/home/me'
target = os.path.join(root,'.extras.txt') # '/home/me/.extras.txt'
db_file= open(target)
databases = json.load(db_file) # works, returns object
databases2 = json.load(open(target)) # equivalent to above, also works
# try to condense code, lose pointless variables target and file
databases3 = json.load(open(os.path.join(root,'.extras.txt'))) # equivalent (I thought!) to above, doesn't work.
Итак... почему не работает версия "все-в-одном", не имеет переменных переменных? О, возвращенная ошибка (теперь она полностью):
$ ./json_test.py
Traceback (most recent call last):
File "./json_test.py", line 69, in <module>
databases = json.load(open(os.path.join(root,'/.extras.txt')))
IOError: [Errno 2] No such file or directory: '/.extras.txt'
И чтобы удовлетворить благожелательный совет С.Лотта... не имеет значения, к какой target
настроен. Базы данных и базы данных2 заполняются правильно, а базы данных3 - нет. target
существует, читается и содержит то, что ожидает Json. Я подозреваю, что что-то, что я не понимаю о характере наложения команд вместе... Я могу заставить код работать, просто интересно, почему сжатая (или сложная?) Версия не удалась.
Код выглядит хорошо, убедитесь, что файлы с ссылками находятся в соответствующих местах. Учитывая ваш код, который включает назначение переменной target/file, полный путь к .extras.txt
/home/me/.extras.txt
Вам нужно сделать:
file = open(target, 'w')
потому что по умолчанию open
попытается открыть файл в режиме чтения (r
), но вам нужно открыть его в режиме w
(write), если вы хотите, чтобы он был создан.
Кроме того, я не буду использовать file
имен переменных, поскольку он также является типом (<type 'file'>
) в python.
Вы также можете добавить флаг режима записи в эту строку:
databases = json.load(open(os.path.join(root,'.extras.txt'), 'w'))
потому что из-за ограниченной информации, которую мы имеем в вопросе, кажется, ваш файл /.extras
ранее не существовал.
Заключительное примечание: вы теряете дескриптор вашего открытого файла в этой строке (поскольку вы не сохраняете его в своей file
переменной):
databases = json.load(open(os.path.join(root,'.extras.txt')))
Как вы собираетесь закрыть файл, когда закончите с ним?
Вы можете сделать это с помощью диспетчера контекста (python> = 2.6 или 2.5, если используется import with_statement
):
with open(os.path.join(root,'.extras.txt'), 'w') as f:
databases = json.load(f)
который позаботится о закрытии файла для вас.