2016-11-06 5 views
0

나는 한동안이 작업에 매달 렸습니다. 현재이 함수는 날짜, 위도, 경도, 사용자 ID, 라이브 트윗의 텍스트를 CSV 파일에 씁니다.tweepy를 사용하여 인코딩 된 JSON 데이터를 CSV에 쓰기

문제는 트윗의 텍스트가 다른 알파벳의 글자를 포함한다는 것입니다. 아라비아 말. 이 편지는이 양식 (\ u0641 \ u064a)에 표시됩니다.

텍스트를 utf-8 문자열로 인코딩하고 나머지 데이터에 추가하여 csv 파일이 모든 문자를 표시 할 수 있습니까?

def on_data(self, data): 
    try: 

     tweets = json.loads(data) 

     with open('Data.csv','a',encoding = 'utf-8') as f: 
      if(tweets['coordinates'] is not None): 
       coordinates_string = json.dumps(tweets["coordinates"]["coordinates"]) 
       val_lg = coordinates_string.split(',')[0].strip("[") 
       val_lt = coordinates_string.split(',')[1].strip("]") 
      else: 
       val_lg = "None" 
       val_lt = "None" 

      text = json.dumps(tweets["text"]) 
      user_id = json.dumps(tweets["user"]["id_str"]) 
      time = json.dumps(tweets["created_at"]) 

      data_string = time + "," + val_lt + "," + val_lg + "," + user_id + "," + text + "\n" 

      print(data_string) 
      f.write(data_string) 


    except: 
     pass 
+0

data_string.decode '는 ("UTF-8")'을해야 작업 –

+0

문자열의 디코딩 된 버전을 쓰려고하면 아무 일도 일어나지 않습니다. – Ivan

+0

try/except/pass를 삭제하십시오. 아마 예외가 숨어있을 것입니다. –

답변

0

json의 남용이 있습니다. loads 트윗이 끝나면 목록의 데이터 필드를 그룹화하고 csv 모듈을 사용하여 멋지게 작성합니다.

import json 
import csv 

# A guess on the data format of the tweet that was parsable by the OP's original code. 
D = {'coordinates' : {'coordinates' : [45.6,122.3]}, 'text' : u'some text\u0641\u064a', 
        'user' : {'id_str' : 'some id'}, 'created_at': 'some date'} 
data = json.dumps(D) 

tweets = json.loads(data) 

# 'utf-8-sig' makes sure the output csv will open in Excel if that is a goal. 
# newline='' is a requirement for csv.writer in Python 3. 
with open('Data.csv','a',encoding = 'utf-8-sig', newline='') as f: 
    # This forces quoting of strings like the OP got from json.dumps 
    w = csv.writer(f,quoting=csv.QUOTE_NONNUMERIC) 

    if tweets['coordinates'] is not None: 
     val_lg = tweets['coordinates']['coordinates'][1] 
     val_lt = tweets['coordinates']['coordinates'][0] 
    else: 
     val_lg = "None" 
     val_lt = "None" 

    text = tweets["text"] 
    user_id = tweets["user"]["id_str"] 
    time = tweets["created_at"] 

    # group the fields in a list for writerow 
    data = [time,val_lt,val_lg,user_id,text] 
    print(data) 
    w.writerow(data) 

출력 (UTF-8 단말)

['some date', 45.6, 122.3, 'some id', 'some textفي'] 

출력 (Data.csv)

"some date",45.6,122.3,"some id","some textفي"