2014-03-02 2 views
2

JSON 파일에서 일부 데이터를 가져 오려고합니다. 여기에 대한 코드는 다음과 같습니다. -JSON 파일에서 데이터로드

import csv 
import json 
ifile = open('facebook.csv', "rb") 
reader = csv.reader(ifile) 

rownum = 0 
for row in reader: 
    try: 
     csvfile = open('facebook.csv', 'r') 
     jsonfile = open('file.json', 'r+') 
     fieldnames = ("USState","NOFU2008","NOFU2009","NOFU2010", "12MI%", "24MI%") 
     reader = csv.DictReader(csvfile, fieldnames) 
     for row in reader: 
      json.dump(row, jsonfile) 
      jsonfile.write('\n') 
     data = json.load(jsonfile) 
     print data["USState"] 
    except ValueError: 
     continue 

프린트 문에 대한 콘솔 출력이 없습니다. JSON의 형식은 다음과 같습니다.

{"USState": "US State", "12MI%": "12 month increase %", "24MI%": "24 month increase %", "NOFU2010": "Number of Facebook UsersJuly 2010", "NOFU2008": "Number of Facebook usersJuly 2008", "NOFU2009": "Number of Facebook UsersJuly 2009"} 
{"USState": "Alabama", "12MI%": "109.3%", "24MI%": "400.7%", "NOFU2010": "1,452,300", "NOFU2008": "290,060", "NOFU2009": "694,020"} 

모든 행에 대해 NOFU2008처럼 액세스하고 싶습니다.

+0

JSON 형식이 정확한 방식입니까? 유효하지 않은 JSON입니다. 그것은 배열에 있어야합니다. – Shadaez

+0

@Shadaez - 네, 그냥이 질문에 JSON 파일의 처음 두 줄을 붙여 넣습니다. JSON 파일을 만들 때 오류가 발생한다는 의미입니까? CSV 파일에서 내용을 추출하고 루프에 대해 JSON 파일을 만듭니다. – newbie

+0

그래, 처음 행을 쓸 때마다 '['다음에 새 행 앞에 ','를 추가하십시오. 마지막 행을 제외하고 여기서 ']'를 추가하십시오. 배열의 각 값을 읽을 수도 있습니다.'for line in data'' data [ "USState"]' – Shadaez

답변

0

파일에 json 개체 목록을 만들려면 json의 목록이 어떤 모양인지 사용자에게 알려야합니다. 요소를 나열 경우

는 당신이 코드로 이런 일을 두어야 쉼표 (,)로 구분됩니다

jsonfile.write(',\n') 
1

문제는 당신이 JSON 파일을 만드는 방법입니다. 각 행에 json.dump()을 사용하고 JSON 파일에 추가하지 않으려 고합니다.

JSON 파일을 만들려면 먼저 원하는 방식으로 전체 파일을 나타내는 Python으로 데이터 구조를 만든 다음 json.dump()을 한 번만 호출하여 전체 구조를 JSON 형식으로 덤프해야합니다.

전체 파일에 대해 하나의 json.dump() 호출을 작성하면 그것이 유효한 JSON이됩니다.

목록/행 배열을 dict/object 안에 배치하여 단일 행이 아닌 전체 JSON 파일과 관련된 다른 속성을 배치 할 것을 권장합니다. 그것은 당신의 facebook.csv 행의 첫 번째 부부처럼 보이는

는 (따옴표 유무에 관계없이)이 같은 있습니다 :

"US State","12 month increase %","24 month increase %","Number of Facebook UsersJuly 2010","Number of Facebook usersJuly 2008","Number of Facebook UsersJuly 2009" 
"Alabama","109.3%","400.7%","1,452,300","290,060","694,020" 

의 우리가 여기 들여 그에서이 JSON 파일을 (생성 할 가정 해 봅시다) 명확성을 위해 다음 JSON 파일의 최상위 오브젝트 (되지 배열)이며,이 목적은 열의 배열 인 rows 속성을 가지고

{ 
    "rows": [ 
     { 
      "USState": "US State", 
      "12MI%": "Number of Facebook usersJuly 2008", 
      "24MI%": "Number of Facebook UsersJuly 2009", 
      "NOFU2010": "Number of Facebook UsersJuly 2010", 
      "NOFU2008": "12 month increase %", 
      "NOFU2009": "24 month increase %" 
     }, 
     { 
      "USState": "Alabama", 
      "12MI%": "290,060", 
      "24MI%": "694,020", 
      "NOFU2010": "1,452,300", 
      "NOFU2008": "109.3%", 
      "NOFU2009": "400.7%" 
     } 
    ] 
} 

참고.

우리는이 JSON 파일을 생성하고이 파이썬 코드를 테스트 할 수

import csv 
import json 

# Read the CSV file and convert it to a list of dicts 
with open('facebook.csv', 'rb') as csvfile: 
    fieldnames = (
     "USState", "NOFU2008", "NOFU2009", "NOFU2010", 
     "12MI%", "24MI%" 
    ) 
    reader = csv.DictReader(csvfile, fieldnames) 
    rows = list(reader) 

# Wrap the list inside an outer dict 
wrap = { 
    'rows': rows 
} 

# Format and write the entire JSON in one fell swoop 
with open('file.json', 'wb') as jsonfile: 
    json.dump(wrap, jsonfile) 

# Now test the file by reading it and parsing it 
with open('file.json', 'rb') as jsonfile: 
    data = json.load(jsonfile) 

# For fun, convert the data back to JSON again and pretty-print it 
print json.dumps(data, indent=4) 

몇 가지 참고 사항은 ...이 코드는 중첩 된 독자가 원본과 루프가 없습니다. 나는 그게 무엇인지 모르겠다. 독자 한 명이 충분해야합니다.

사실이 버전은 루프를 전혀 사용하지 않습니다. 이 라인은 독자 객체에서 행의 목록을 생성합니다 :

rows = list(reader) 

는 또한 CSV 및 JSON 파일이 열립니다 with의 사용을 사용하도록주의를 지불해야합니다. 이는 파일이 with 블록의 끝에 자동으로 닫히기 때문에 파일을 여는 좋은 방법입니다.

지금이 모든 것을 말하면서,이 정확한 JSON 구조가 정말로 원하는 것인지 궁금해해야합니다. CSV의 첫 번째 행이 헤더 행 인 것처럼 보이므로 해당 행을 건너 뛰어도됩니까?당신은 목록에 CSV 데이터의 나머지 부분을 변환하기 전에 reader.next() 호출을 추가하여 쉽게 그렇게 할 수 있습니다

reader.next() 
    rows = list(reader) 

또한 나는 당신이 결과 데이터에 액세스하는 방법을 이해 모르겠어요. USState은 각 행 개체의 속성이므로 data["USState"]을 사용할 수 없습니다. 데이터에 액세스하려는 방법에 대해 조금 더 설명하고 정리할 수 있습니다.