Python open () с минимальными переменными

1

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

  • 0
    Вы уверены, что перед e в extras.txt должна быть точка? Это может быть причиной этой проблемы.
  • 2
    Вы уверены, что root верен, ошибка предполагает, что это / или '', в то время как ваш код дает что-то еще
Показать ещё 7 комментариев
Теги:
file-io

2 ответа

0

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

/home/me/.extras.txt

0

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

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)

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

  • 0
    Это не запись, хотя. Просто чтение. И я все равно попытался сделать это явно с флагом ... ничего не изменилось. Я изменил имя переменной для файла, это не то, что я называл ... неудачей с моей стороны из-за простоты чтения, извините.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню