2017-04-12 10 views
1

を使用してJSONファイルからUnicode文字を書くには、私は付属のPythonコード(PythonのV3.5.1)を使用して、以下のJSONデータを読み込むしようとしていますが、問題がその文字çとしてç表現とÂとして£です£読むとPython

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

Pythonコード:

import json 
import os 

fileLoc=os.path.join(os.getcwd(),"appconfig.json") 
json_data=open(fileLoc).read() 
print(json_data) 
形式またはcharを変更せずに、正しくファイルにしてからデータを読み書きするコードで私を助けてください

JSONデータを設定し

出力:

{ 
    "config":[{ 
      "filetype": ".csv", 
      "coldelimiter":"ç", 
      "rowdelimiter":"£" 
    }] 
} 

答えて

0

暗黙のエンコードとデコードを避けてください。

open()を使用してテキストファイル(JSONなど、XMLとは異なります)を読み取る(または書き込む)と、ファイルの内容はデフォルトのエンコードでデコードされます。 使用されるデフォルトのエンコーディングは環境によって異なります。 locale.getpreferredencoding()でこれを見ることができます。

それではappconfig.jsonはUTF-8でディスクに保存されているが、あなたのロケールがラテン-1、çはシーケンスçと誤解され、その後の文字を使用するように設定されていると仮定しましょう。確認してください:

>>> 'ç'.encode('utf8').decode('latin1') 
'ç' 

このような場合は、それが解決するのは簡単です:open()にエンコーディングを指定します。

with open(fileLoc, 'r', encoding='utf8') as f: 
    json_data = f.read() 

別の可能な(しかし、可能性が低い)説明があります:たぶんデフォルトのエンコーディングはすでにありますUTF-8を使用すると、ファイルから読み取ったときにデータが正しくデコードされます。 print()式は、UTF-8を使用してデータを再度エンコードします。これにより、ファイル内容とまったく同じSTDOUTに一連のバイトが送信されます。 しかし、あなたの端末(またはスクリプトを実行するために使用するもの)は、の出力をLatin-1として誤って解釈し、文字化けして表示されます。

端末の設定を修正する(UTF-8を受け入れる)か、sys.stdoutsys.stdout = codecs.getwriter('latin-1')(sys.stdout)と再エンコードする必要がありますが、お勧めしません)。

+0

ありがとう@lenz、はい、私はやったことをして、今はその作業。異なるノートでは、私はUnixのenvには新しいです。私はソースコードをビルドしてWin envでテストしたのは、同じPythonのバージョンが使われていればUnix envで動作していると思います。 ファイルのパスまたは場所については、私はosパッケージのjoin(sourceLoc、file)のように使用しています。 Windowsの場合、pathはc:\ filelocationとなり、Unixでは/ var/sp/filelocation/ となります。 – RintG

+0

@RintG私は理解できません。 OS間で移植可能なコードを記述しようとしている場合や、 'os.path.join'を使用してパスを記述するのは確かに良い選択です。 Unix上でPythonに関するより具体的な質問がある場合は、別の質問を投稿してください。 – lenz