2015-01-08 2 views
0

파이썬에서 json 파일을로드하려고합니다. 내 json 파일은 다음과 같습니다.파이썬에서 json 파일로드

{'awesomeness': 2.5, 'party': 'Republican', 'Age': 50, 'State': 'California', 'Ideology': 0.5, 
'time': {'day': 20, 'mon': 2, 'sec': 3}, 'overall': 9.5, 'review': 'Best Senator ever\tPretty balanced 
view.\tNot sure if he can get reelected'} 
{'awesomeness': 0.5, 'party': 'Republican', 'Age': 70, 'State': 'New York', 'Ideology': 0.8, 
'time': {'day': 25, 'mon': 8, 'sec': 31}, 'overall': 5.5, 'review': 'NA'} 

이것은 내 코드입니다.

with open("senator.json") as json_file: 
    data = json.load(json_file) 

하지만 오류를 다음있어,

File "<stdin>", line 1, in <module> 
File "<string>", line 2, in <module> 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 290, in load 
**kw) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
return _default_decoder.decode(s) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 381, in raw_decode 
obj, end = self.scan_once(s, idx) 
ValueError: Expecting property name: line 1 column 2 (char 1) 

왜이 오류가 않고 어떻게이 파일을로드 할 수 있습니까? 어떤 도움을 주셔서 감사합니다!

+1

JSON이 작은 따옴표로 묶인 것과 관련이있을 수 있습니다. 유효한 JSON은 큰 따옴표입니다. JSON을 미화 (http://jsonformatter.curiousconcept.com/)를 통해 퍼팅 해보고 오류가 다시 발생하면 문제가 발생합니다. – Jordan

+0

또한 여기에 솔루션에 태그를 추가하십시오. 파일을 json으로 만들려면 ast.literal_eval을 사용하여 한 번로드하고 json.dumps (값)를 다시 파일에 적용하여 유효한 JSON으로 만들 수 있습니다. literal_eval은 이와 같은 문자열을로드하는 데 사용하면 안되므로 자신에게 유리하게 변환하십시오. 도로 아래에서 두통을 덜어줍니다 – Jordan

답변

0

JSON 문자열은 단일이 아닌 큰 따옴표로 구분됩니다. 귀하의 의견은 진정한 JSON이 아닙니다.

+0

질문의 두 번째 부분은 무엇입니까? – alecxe

+0

당신은 (a) 파일을 편집하여 진정한 JSON 형식을 사용하거나,'sed' 또는 어떤 수단을 사용하든, 현재 코드가 작동 할 수 있습니다. (b) 현재 파일을 파이썬 문자열로 읽어 들일 수 있으며,'replace'를 사용하여 작은 따옴표를 이중으로 변경하고 (이스케이프 된 임베디드 작은 따옴표에주의하십시오),'json.loads'를 사용하여 변경된 문자열에서로드 할 수 있습니다. –

1

귀하의 JSON 파일이 올바른 JSON 형식이 아닌 ... 나는 그것이이

{'awesomeness': 2.5, 'party': 'Republican', 'Age': 50, 'State': 'California', 'Ideology': 0.5,'time': {'day': 20, 'mon': 2, 'sec': 3}, 'overall': 9.5, 'review': 'Best Senator ever\tPretty balanced w.\tNot sure if he can get reelected','awesomeness': 0.5, 'party': 'Republican', 'Age': 70, 'State': 'New York', 'Ideology': 0.8,'time': {'day': 25, 'mon': 8, 'sec': 31}, 'overall': 5.5, 'review': 'NA'}

처럼해야한다고 생각합니다 그리고 당신은 읽을 수 file.Syntax이

with open("senator.json","r") as json_file: 
    data = json.load(json_file) 
+0

이것은 유효한 JSON이 아닙니다. 유효한 JSON은 큰 따옴표입니다. – Jordan

4

이다 읽어야 다른 사람들이 이미 지적했듯이 JSON은 불법입니다. 이것이 파이썬 JSON 파서가 평면적으로 떨어지는 이유입니다. 그들이 내부 그래서

[ 
    { 
    "awesomeness": 2.5, 
    "party": "Republican", 
    "Age": 50, 
    "State": "California", 
    "Ideology": 0.5, 
    "time": { 
     "day": 20, 
     "mon": 2, 
     "sec": 3 
    }, 
    "overall": 9.5, 
    "review": "Best Senator ever \t Pretty balanced view. \t Not sure if he can get reelected" 
    }, 
    { 
    "awesomeness": 0.5, 
    "party": "Republican", 
    "Age": 70, 
    "State": "NewYork", 
    "Ideology": 0.8, 
    "time": { 
     "day": 25, 
     "mon": 8, 
     "sec": 31 
    }, 
    "overall": 5.5, 
    "review": "NA" 
    } 
] 

주의 대신 작은 따옴표의 문자열에 대한 따옴표 (불법 JSON 내부 문자열을 표시하기 위해)와 대괄호에 두 개체 {...} 포장 : 귀하의 JSON은 다음과 같이한다 array.

JSON이 계층 구조이기 때문에 후자가 필요합니다. 게시 된 JSON 코드에는 단순히 외부 구조가없는 두 개의 객체가 나란히 있습니다. 이 경우 대괄호 (배열 없음)를 남겨두면 JSON 파서는 EOF 일 때 실제로 첫 번째 객체 뒤에 쉼표 ,이 갑자기 나타납니다.

이제 다시 코드를 실행하려고하면 :

with open('senator.json', 'r') as json_file: 
    data = json.load(json_file) 

당신은 어떤 오류없이 파일을 읽을 수 있어야합니다.

0

이 작은 따옴표 문제를 해결할 다른 방법을 찾았습니다. 이 파일을 읽기 위해서는 for 루프와 eval를 사용했습니다.

이것은 내가 사용한 코드입니다.

def getdata(file): 
    for l in open(file): 
    yield eval(l) 

thedata = list(getdata('filename.json') 

문제를 알려 주신 모든 분들께 감사드립니다.

+1

'eval'은 ** evil **입니다. 이것은 JSON 자체 (또는 JSON을 생성하는 코드) 내에서 수정되어야하는 문제에 대해 추악하고 위험한 해결 방법으로 들립니다. 임의의 파이썬 코드가 실제로 JSON 파일 안에 숨어 있다는 것을 알지 못합니다. 이제는 맹목적으로 실행합니다 ... – Timusan