Python open () с минимальными переменными - PullRequest
1 голос
/ 08 сентября 2011

Цель состоит в том, чтобы просмотреть файл 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.Я подозреваю, что есть кое-что, чего я не понимаю в природе объединения команд ... Я могу заставить код работать, просто интересно, почему не удалось получить краткую (или сложную?) Версию.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

Вам нужно сделать:

file = open(target, 'w')

потому что по умолчанию open попытается открыть файл в режиме чтения (r), но вам нужно открыть его в режиме w (запись), если вы хотите, чтобы он был создан.

Кроме того, я бы не использовал имя переменной 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)

, который позаботится о закрытии файла для вас.

0 голосов
/ 08 сентября 2011

Код выглядит нормально, убедитесь, что ссылки на файлы находятся в соответствующих местах.Учитывая ваш код, который включает назначение переменной цели / файла, полный путь к .extras.txt равен

/ home / me / .extras.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...