Python 2.7(x64 Linux))を実行して、dict
をJSONオブジェクトに変換しようとしています。
>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=0, releaselevel='final', serial=0)
simplejson
(標準ライブラリからjson
にフォールバック)を使用しようとしていますが、次のエラーが表示されます。
>>> try: import simplejson as json
... except ImportError: import json
...
>>> metadata = dict()
>>> metadata['foo'] = 'bar'
>>> print metadata
{'foo': 'bar'}
>>> json.dumps(metadata)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps'
json
またはsimplejson
をPython 2.7と一緒に使用することについて私が見逃している明らかな何かがありますか?
古いPythonインストール済み環境からロードされた古いjson
ライブラリーがありました:
>>> import json
>>> print json.__file__
/home/areynolds/opt/lib/python2.5/site-packages/json.pyc
その古いものを削除すると、問題が修正されました。ありがとう!
同様の問題があった場合、別のカスタムモジュールが原因でした。別のスクリプトにjson.py
そして、カスタムjson.pyファイルをモジュールとしてロードしようとしたことがわかりました。ダンプメソッドは明らかに利用できません。
Json.pyスクリプトの名前を別のもの(json2.py)に変更すると、この問題は解消されました。
これらの2つのライブラリのいずれでもないパスにjson
またはsimplejson
という名前のファイルがありますか?その場合、pythonは実際のライブラリの代わりにそのファイルをロードします。
AttributeError: 'module' object has no attribute 'dumps'
おそらく、Pythonのsys.path
から到達可能なjson.pyというファイルを作成したでしょう。または、json.pyというファイルを含むディレクトリをPythonのsys.pathに追加しました。
オプション1: 井戸を毒する jsonをインポートしてから、同じエイリアスを持つ別のモジュールをインポートする:
eric@dev /var/www/sandbox/eric $ python
>>> import json
>>> json.dumps([])
'[]'
>>> import sys as json
>>> json.dumps([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps'
オプション2: 井戸を毒する python path:
新しいファイルjson.pyを作成して保存します。そこにこのコードを入れてください:
def foo():
print "bar"
pythonターミナルを開き、jsonをインポートします。
eric@dev /var/www/sandbox/eric/wsgi $ python
>>> import json
>>> type(json)
<type 'module'>
>>> json.dumps([])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps'
>>> json.foo()
bar
メソッドが存在しないことを示しています。だからpythonに尋ねて、このモジュールの性質についてもっと教えてください。だれがそれを毒殺したかの手がかりを見つけるでしょう。
>>> print json
<module 'json' from 'json.py'>
>>> dir(json)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']
>>> type(json)
<type 'module'>
Pythonパスに "json"と呼ばれる別のスクリプトがある場合がありますが、これは誤ってインポートしています。これは、管理下のスクリプトの名前を変更するか、
from __future__ import absolute_import
Json.pyという名前のファイルを作成します。これを実行すると、エラーが発生したので、名前を変更して、それを言葉にしました。
Json.dump()の実行中に私も同様のエラーに直面していました。私の場合、エラー文字列を取得していました:
AttributeError: 'file'オブジェクトには属性 'dump'がありません
修正方法-
同じスクリプトでファイル記述子の「json」として変数名を使用していたため、このエラーが発生していました。そのため、単に変数名を変更し、問題を解決しました。
問題および解について以下で説明しました
問題: Pythonでインポート関数を呼び出すとき、python作業ディレクトリ内でモジュールを見つけようとします。ローカルディレクトリ内で見つからない場合は、そのときです。標準ライブラリおよびその他のグローバルリポジトリを検索します。したがって、jsonモジュールをインポートしようとすると、ディレクトリ内でそれを見つけようとし、「json.py」という名前のファイルがある場合、pythonはこのモジュールをロードし、json.py内で「dump」関数を見つけようとします。ファイル内で「dump」関数が見つからない場合は、「modules object has no attribute 'dumps」というエラーがスローされます'。
解像度:「json.py」ファイルの名前を別の名前に変更します:json_file.pyまたは「json.py」以外の名前。
このエラーは別のコンテキストで発生しましたが、それでもjsonという名前の2つのうちの1つです。 Django(a Python HTTPリクエストへの応答を準備する関数)、この場合はリクエストを処理するビューでJSON形式のデータ。
しかし、ビューに「json」という名前を付けました。悪い動き。 print dir(json)がビュー "json"でダンプなしの応答を返したのに、同様のビューでは属性として "dumps"が表示されたので、私は混乱しました。
この議論で問題は解決しました。