Sh4n3e

[Python] Unicode JSON을 Ascii 형태의 Dictionary로 변환 그리고 CSV로 저장하기 본문

Programming/Python

[Python] Unicode JSON을 Ascii 형태의 Dictionary로 변환 그리고 CSV로 저장하기

sh4n3e 2017. 11. 3. 18:28

Unicode JSON을 Ascii 형태의 Dictionary로 변환 및 CSV형태로 저장

[How to convert Unicode JSON to Ascii Dictionary and to save CSV file?]


오늘은 Unicode 형태의 JSON을 Ascii 형태의 Dictionary로 변환을 해보도록 하자.

사실 이렇게 했던 이유는 웹에서 JSON을 가져왔는데 u'형태로 저장되어 있었고, 이놈을 CSV파일 형태로 저장하려는데,

제대로 저장을 못한다는 것을 알게되었다... (왜냐하면? Unicode형태니까..)

따라서 Unicode로 저장되어 있던 JSON을 UTF-8형태로 저장해야지만 CSV를 열었을때, 제대로 저장되어 읽힌다는 것을 알게되었다...


이제 이것을 어떻게 풀어나가는지 한번 보자.

우선은 URL Request를 하여 Response를 Read할때 JSON은 일반적인 방법을 통해 Load할 수 없다.

import json을 해주고, json.load(Response)를 통해서 불러들일 수 있다.

하지만 정말 문제는... 여기부터다. 저장된 값은 

{u'a': u'b', u'c': u'd', u'counts': u'0', u'users': []}

위와같이 Unicode 형태로 저장되는데... 이것은

json.dumps(res, ensure_ascii=False) 를 통해 문자 Encoding을 하고, eval()을 통해 다시 Dictionary형태로 저장한다.


또한 이렇게 변환된 JSON을 CSV형태로 저장하는 것은 아래와 같은 순서로 저장하면 된다.


outFile = open('C:\\Test.csv', 'wb+')     #Binary 형태로 Writing

dict_writer = csv.DictWriter(outFile, fieldnames=['id', 'name', 'address'])

input_writer = csv.writer(outFile)

dict_writer.writerow(result['users'][i])


구체적인 부분은 아래의 코드를 참조하면 정확한 루틴의 파악이 가능하다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import urllib2, urllib
import json
import csv
def URLRequest(start, finish):
    # Url
    url = 'https://testURL'
 
    # Http Header
    headers = {'Content-Type''application/json',
               'User-Agent''Dalvik/2.1.0 (Linux; U; Andriod 5.0)',
               'Connection''Keep-Alive',
               'Accept-Encoding''gzip'}
 
    #File Opening for csv
    outFile = open('C:\\Test.csv''wb+')     #Binary 형태로 Writing
    dict_writer = csv.DictWriter(outFile, fieldnames=['id''name''address'])
    input_writer = csv.writer(outFile)
 
    #For Count
    global count
    count = 0
    for i in range(start, finish):
        tempUrl = url + '/users?No='+str(i)
 
        # Http Request 이건 GET방식으로 보내는데 Header를 변조하여 Request하고 싶을 떄 이렇게 한다.
        request = urllib2.Request(tempUrl, None, headers)
 
        # Http Resopnse 굳이 위의 방법을 쓰기 싫다면 그냥 URL을 response = urllib2.urlopen(tempUrl) 이런방식으로 써도 무방하다.
        response = urllib2.urlopen(request)
 
        # Response Read, JSON으로 Respose하는 경우 json.load()를 통해 Read한다.
        # 일반적으로 URL을 Read할때는 response.read()를 사용하여 읽는다.
        # Header를 볼때엔 response.info(), Code를 볼때엔 response.code()를 통해 읽어들인다.
        res = json.load(response)
        # 불러온 JSON이 Unicode형태이기 때문에, json.dumps(json, ensure_ascii=False) 함수와 옵션을 통해 
        # Unicode형태를 Ascii 형태로 바꿔준다.
        result = json.dumps(res, ensure_ascii=False)
        # 이렇게 바꿔준 녀석은 Dictionary형태에서 일반 String형태로 바껴버리기 때문에
        # eval()함수를 통해 해당 결과를 Dictionary형태로 다시 변환시켜준다.
        result = eval(result)
 
        print 'Progress [%d/%d].... Try to Connect %s'%(i-start+1, finish-start, thngId)
 
        if result['counts'!= "0" :
            count = count+1
            input_writer.writerow(['No', i])
            dict_writer.writeheader()
            for i in range(0int(result['counts'])) :
                dict_writer.writerow(result['users'][i])
            #Add Empty Line
            input_writer.writerow([''])
 
if __name__ == "__main__":
    URLRequest(4760048000);
    print 'Total Count is %d'%(count)
cs


Comments