2016-06-26 5 views
0

Ich erhalte eine große Datendatei von externen Service, wobei jede Zeile ein JSON-Objekt ist. Er enthält jedoch mehrere Hex-Zeichen wie (\ XeF, \ xa0, \ xA9) etc und einige Unicode-Zeichen wie (\ u2022) .Ich im Grunde die Datei lese wieJSON lädt fehlschlägt invaild Escape-Zeichen

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

Ich habe versucht, geben Codierung utf-8 und Latin-1 zu der offenen Methode, aber immer noch Json Lasten versagt. Wenn die ungültigen Zeichen entfernt werden, funktioniert das Laden, aber ich möchte keine Daten verlieren. Was ist der empfohlene Weg, um dies zu beheben?

repr (Linie) Beispiel:

'{"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 bei \ XF6 in item_name mit ungültigem \ escape andernfalls: Zeile 1 Spalte 105 (char 104).

+0

entweder Ihre Datei ist gültig JSON oder es nicht ist. Können Sie uns eine richtige Probe zur Verfügung stellen? '\ u2022' ist gültige JSON-Syntax. Wenn Sie * literalen Text * mit '\ xef' haben, dann ist das kein gültiger JSON. Wenn dies Bytes sind, verwenden Sie den Ausdruck 'repr()' einer solchen Zeile. –

+0

@MartijnPieters Probe und Fehler hinzugefügt. – Stormbringer

+0

Das ist keine Zeile, noch ist es die Ausgabe von 'repr()'. Wir können nicht feststellen, ob '\ xa0' auf diese Weise ein einzelnes Byte oder 4 separate Zeichen ist. –

Antwort

0

Sie können die JSON-Zeichenfolge mit Regex als @Martijn erwähnt beheben. Hier ist ein ausführliches Beispiel.

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))) 

und die Ausgabe:

{'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

Die '\ uhhh' Fluchten sind vollkommen gültig. Nur die '\ xhh' Fluchten müssen repariert werden. –

+0

@MartijnPieters Oh, war mir nicht bewusst. Entfernen sie ... – totoro

+0

@MartijnPieters Ja, es gibt tatsächlich das gleiche Ergebnis – totoro

Verwandte Themen