2011-09-07 38 views
1

目的是查看腳本上方目錄中的json文件並加載它在該文件中找到的內容。這是我有:Python打開()以最小的絨毛變量

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

你確定root是正確的錯誤表明它是/或'',而你的代碼給了別的 – Mark

+0

根回到'/ home/me'這是預期和目標回來(當明確建立時)'/ home/me/.extras.txt',也是預期的。 – Wounder

+1

@Wounder:請(1)更新問題。切勿將評論添加到您擁有的問題中。 (2)用工作和非工作示例的'target'值更新。請創建一個非常非常清晰的日誌。這個問題很難解決問題。 –

回答

0

代碼看起來不錯,請確保引用的文件位於適當的位置。鑑於你的代碼,包括目標/文件變量賦值,以.extras.txt完整路徑是

/home/me/.extras.txt

0

你需要做的:

file = open(target, 'w') 

因爲默認情況下,open會嘗試以讀取模式(r)打開文件,但如果需要創建,則需要在w(寫入)模式下將其打開。

另外,我不會使用變量名file,因爲它也是python中的一個類型(<type 'file'>)。

你可以寫模式標誌添加到這一行,以及:

databases = json.load(open(os.path.join(root,'.extras.txt'), 'w')) 

因爲我們有問題的資料有限,它出現在您/.extras文件不存在以前。

最後一點,你正在失去手柄打開的文件中這一行(因爲你是不是在你的file變量存放):

databases = json.load(open(os.path.join(root,'.extras.txt'))) 

你怎麼打算什麼時候關閉文件」重新完成了嗎?

你可以使用上下文管理器(蟒蛇> = 2.6或2.5使用如果import with_statement)做到這一點:

with open(os.path.join(root,'.extras.txt'), 'w') as f: 
    databases = json.load(f) 

將採取關閉該文件爲你的照顧。

+0

雖然這不是寫作。只是一個閱讀。無論如何,我試圖用旗幟明確表示......並沒有改變事情。 我改變了文件的變量名稱,這不是我所謂的......我的部分因可讀性而失敗,對不起。 – Wounder