2016-06-26 10 views
0

外部サービスから大きなデータファイルを取得しています。各行はjsonオブジェクトです。しかし、それは(\のXeF、\ XA0、\ xa9)などのような複数の六角文字と(\ u2022).Iは基本的に私はエンコーディングUTF-8を与えてみましたinvaildエスケープ文字でJSONの読み込みに失敗する

with open(filename,'r') as fh: 
    for line in fh: 
     attr = json.loads(line) 

のようなファイルを読んでいるようないくつかのUnicode文字が含まれていますopenメソッドにlatin-1を渡しますが、まだjsonのロードは失敗しています。無効な文字が削除された場合、読み込み中ですが、データを失うことはありません。これを修正するための推奨方法は何ですか?

のrepr(ライン)サンプル:

'{"product_type":"SHOES","recommended_browse_nodes":"361208011","item_name":["Citygate 960561 Ankle Boots Womens Gray Grau (anthrazit 9) Size: 8 (42 EU)"],"product_description":[],"brand_name":"Citygate","manufacturer":"J H P\\xf6lking GmbH & Co KG","bullet_point":[],"department_name":"Women\\u2019s","size_name":"42 EU","material_composition":["Leather"]}\n' 

json.loadsが無効\エスケープとITEM_NAMEに\ XF6に失敗している:行1列105(チャー104)。

+0

あなたのファイルが有効なJSONであるかそうでないのいずれか。適切なサンプルを提供できますか? '\ u2022'は有効なJSON構文です。 '\ xef'でリテラルテキスト*がある場合、それは有効なJSONではありません。これらがバイトの場合は、その行の 'repr()'出力を使用してください。 –

+0

@MartijnPietersサンプルとエラーが追加されました。 – Stormbringer

+0

これは1行ではなく、 'repr()'の出力でもありません。このように '\ xa0'がシングルバイトか4個の別個の文字かどうかは判断できません。 –

答えて

0

正規表現を使用してJSON文字列を@Martijnと修正することができます。ここには冗長な例があります。

import re 
import json 

s = '{"product_type":"SHOES","recommended_browse_nodes":"361208011","item_name":["Citygate 960561 Ankle Boots Womens Gray Grau (anthrazit 9) Size: 8 (42 EU)"],"product_description":[],"brand_name":"Citygate","manufacturer":"J H P\\xf6lking GmbH & Co KG","bullet_point":[],"department_name":"Women\\u2019s","size_name":"42 EU","material_composition":["Leather"]}\n' 

xinvalid = re.compile(r'\\x([0-9a-fA-F]{2})') 

def fix_xinvalid(m): 
    return chr(int(m.group(1), 16)) 

def fix(s): 
    return xinvalid.sub(fix_xinvalid, s) 

print(json.loads(fix(s))) 

と出力:

{'recommended_browse_nodes': '361208011', 'bullet_point': [], 'product_description': [], 'brand_name': 'Citygate', 'size_name': '42 EU', 'material_composition': ['Leather'], 'product_type': 'SHOES', 'item_name': ['Citygate 960561 Ankle Boots Womens Gray Grau (anthrazit 9) Size: 8 (42 EU)'], 'department_name': 'Women’s', 'manufacturer': 'J H Pölking GmbH & Co KG'} 
+0

'\ uhhhh'エスケープは完全に有効です。 '\ xhh'エスケープだけが修正が必要です。 –

+0

@MartijnPietersああ、知らなかった。それらを削除する... – totoro

+0

@MartijnPietersはい、それは確かに同じ結果を与えます – totoro

関連する問題