python
  • json
  • text
  • import
  • 2016-02-04 39 views 6 likes 
    6

    Python 3.5.1を使用して、各行がJSON形式のテキストファイルを取得しました: {"a": "windows"、 "b": "stairs"私は、ファイルの最初の行を印刷する問題がないので、私は、ファイルのパスが正しいことを安心していますJSONオブジェクトはバイトではなくstrでなければなりません

    the JSON object must be str, not 'bytes' 
    

    :...}

    import json 
    path = 'folder/data.txt' 
    records=[json.loads(line) for line in open(path,'rb')] 
    

    しかし、私はエラーを受け取りました。

    +3

    はたぶん、あなたの中に 'B' を取り除きますオープンコール? https://docs.python.org/2/library/functions.html#openに記載されているように、ファイルをバイナリ形式でロードすると、文字列として扱われていない可能性があります。 – TW80000

    +0

    ファイルの行を1行だけ使用すると、jsonにロードできますか? 'json.loadsのような(file.readlines()[0])' –

    +0

    TW80000 @あなたの提案は私の問題を解決します。また、 'open'呼び出しの中で' encoding = 'utf-8''を直接渡すことも学びました。ご意見ありがとうございます。 – Greg

    答えて

    3

    オープンテキストモードではなくバイナリモード(JSONは、通常、UTF-8として格納されているので、おそらく、明示的に、システム・デフォルトをオーバーライドするencoding='utf-8'を渡す)にあるファイル。 jsonモジュールの入力はstrになります。バイナリモードで開いたファイルからの読み込みがbytesオブジェクトを返します。

    # Using with statement just for good form; in this case it would work the 
    # same on CPython, but on other interpreters or different CPython use cases, 
    # it's easy to screw something up; use with statements all the time to build good habits 
    with open(path, encoding='utf-8') as f: 
        records=[json.loads(line) for line in f] 
    
    +0

    これは機能し、適切なフォームの使用に関するアドバイスをいただき、ありがとうございます。私の元のコードで 'encoding =' utf-8 'の' rb 'を切り替えることも同様です。 – Greg

    1

    あなたはファイルのバイナリ表現は、JSONモジュールによって読み取り可能であることを行っていないため、「RB」を指定する必要はありません。おそらく "utf-8"エンコーディングと "読み込み"が必要です。編集:私はもともとこれらの両方がデフォルトであると言っていましたが、多くのOSのデフォルトのエンコーディングが異なり、Pythonはopen()のデフォルトとしてシステム設定を使用しています。私は、明示的にエンコーディング設定を "utf-8"として提供することをお勧めします。

    jsonは、文字列から読み込まれる "json.loads"の代わりに "json.load"ではなく、 "json.load"を使用して読み込みをサポートしているため、テキストとして読み込みをスキップしてJSONに右に移動できます。私は個々の行を "ロード"したくないと考えています。なぜなら、これは有効なJSONではないからです。

    import json 
    # open has __enter__ and __exit__ functions, so we can call it as a guard 
    # using "with" syntax and it'll close when the scope ends 
    with open(r".\myjson.json", encoding="utf-8") as fh: 
        # load() is a convenience function to help us avoid iterating lines 
        # on our own. It calls loads() on the whole doc and returns an obj 
        json_obj = json.load(fh) 
    print (json_obj) 
    
    +1

    UTF-8が常にhttps://docs.python.org/3/library/functions.html#デフォルトの 'encoding'、([それは' '(偽)locale.getpreferredencodingを使用して、プラットフォームに依存設定から動的に決定されます]ではありません開いた)。入力がUTF-8であることが分かっている場合は、明示してください。同様に、誰かが書いた場合は一緒になって、ファイル全体が有効なJSONではありませんので、JSONは1-1ラインずつ、あなたは、一度にファイル全体を読み込むことができないのBLOB、行が孤立して唯一の合法JSONです。また、 'json.load'は単に' file.read() 'を呼び出して' loads'に渡すので、 'loads'よりも良くないことも悪くもありません。また、Py3 'print'は括弧を必要とします。 – ShadowRanger

    +0

    素晴らしい点、@ ShadowRanger。 )(負荷のために()の負荷対、私はそこここに性能差があったが、我々は、書き込み/読み込み/私たち自身のコード内で維持する必要はありませんforループがあることを暗示することを意味するものではありませんでした。 load()を使用するとノイズが少なくなります。これは通常、処理を行うための非常に難しい方法です。印刷物は2.7通訳で働いていた(私の悪いと固定)。 UTF-8はあなたが完全に正しいと思っています。私はWindows上でそれを前に置いておく必要があります(必ずしもOPのケースではありません)。 –

    +0

    は実際に、Windows上で、私はUTF-8がデフォルトだとは思わない、それは通常、Windowsのコードページ(例えばCP1252、追加の印刷可能な文字で、通常は未使用の制御文字の一部を置き換えるラテン-1のバリエーションの一つです、スマート引用符など)。データがすべてASCIIであれば、いずれの方法でも(UTF-8とcp1252の両方がASCIIスーパーセットです)、問題があるASCII範囲外に到達したときのみです。コードページを除いて、Windowsは通常、すべての目的でUTF-16を使用します。 (UTF-8が標準である)インターネット上のデータを扱うときにのみUTF-8を受け入れます。 – ShadowRanger

    2

    試してください:[オープン(パス 'RB')で行のjson.loads(。ラインデコード())] 記録=

    関連する問題