2016-02-28 2 views
1

Меня интересует интеллектуальный анализ данных, и я хотел бы открыть и работать с данными yelp. Данные Yelp находятся в формате json, и на своем сайте он имеет следующий код для преобразования json в csv. Однако, когда я открываю командную строку и записываю следующее:JSON to CSV converter-YELP Data Set-python

$ python json_to_csv_converter.py yelp_academic_dataset.json 

Я получаю сообщение об ошибке. Не могли бы вы мне помочь?

Код:

# -*- coding: utf-8 -*- 
"""Convert the Yelp Dataset Challenge dataset from json format to csv. 
For more information on the Yelp Dataset Challenge please visit http://yelp.com/dataset_challenge 
""" 
import argparse 
import collections 
import csv 
import simplejson as json 


def read_and_write_file(json_file_path, csv_file_path, column_names): 
    """Read in the json dataset file and write it out to a csv file, given the column names.""" 
    with open(csv_file_path, 'wb+') as fout: 
     csv_file = csv.writer(fout) 
     csv_file.writerow(list(column_names)) 
     with open(json_file_path) as fin: 
      for line in fin: 
       line_contents = json.loads(line) 
       csv_file.writerow(get_row(line_contents, column_names)) 

def get_superset_of_column_names_from_file(json_file_path): 
    """Read in the json dataset file and return the superset of column names.""" 
    column_names = set() 
    with open(json_file_path) as fin: 
     for line in fin: 
      line_contents = json.loads(line) 
      column_names.update(
        set(get_column_names(line_contents).keys()) 
        ) 
    return column_names 

def get_column_names(line_contents, parent_key=''): 
    """Return a list of flattened key names given a dict. 
    Example: 
     line_contents = { 
      'a': { 
       'b': 2, 
       'c': 3, 
       }, 
     } 
     will return: ['a.b', 'a.c'] 
    These will be the column names for the eventual csv file. 
    """ 
    column_names = [] 
    for k, v in line_contents.iteritems(): 
     column_name = "{0}.{1}".format(parent_key, k) if parent_key else k 
     if isinstance(v, collections.MutableMapping): 
      column_names.extend(
        get_column_names(v, column_name).items() 
        ) 
     else: 
      column_names.append((column_name, v)) 
    return dict(column_names) 

def get_nested_value(d, key): 
    """Return a dictionary item given a dictionary `d` and a flattened key from `get_column_names`. 

    Example: 
     d = { 
      'a': { 
       'b': 2, 
       'c': 3, 
       }, 
     } 
     key = 'a.b' 
     will return: 2 

    """ 
    if '.' not in key: 
     if key not in d: 
      return None 
     return d[key] 
    base_key, sub_key = key.split('.', 1) 
    if base_key not in d: 
     return None 
    sub_dict = d[base_key] 
    return get_nested_value(sub_dict, sub_key) 

def get_row(line_contents, column_names): 
    """Return a csv compatible row given column names and a dict.""" 
    row = [] 
    for column_name in column_names: 
     line_value = get_nested_value(
         line_contents, 
         column_name, 
         ) 
     if isinstance(line_value, unicode): 
      row.append('{0}'.format(line_value.encode('utf-8'))) 
     elif line_value is not None: 
      row.append('{0}'.format(line_value)) 
     else: 
      row.append('') 
    return row 

if __name__ == '__main__': 
    """Convert a yelp dataset file from json to csv.""" 

    parser = argparse.ArgumentParser(
      description='Convert Yelp Dataset Challenge data from JSON format to CSV.', 
      ) 

    parser.add_argument(
      'json_file', 
      type=str, 
      help='The json file to convert.', 
      ) 

    args = parser.parse_args() 

    json_file = args.json_file 
    csv_file = '{0}.csv'.format(json_file.split('.json')[0]) 

    column_names = get_superset_of_column_names_from_file(json_file) 
    read_and_write_file(json_file, csv_file, column_names) 

Ошибка я получаю в командной строке:

Traceback (most recent call last): 
File "json_to_csv_converter.py", line 122, in column_names=get_superset_of_column_names_from_file 
File "json_to_csv_converter.py", line 25, in get_superset_of_column_names_from_file 
for line in fin: 
File "C:\Users\Bengi\Appdata\Local\Programs\Python\Python35-32\lib\encodings\cp1252.py" line 23, in decode 
return codecs.charmap_decode(input, self_errors,decoding_table)[0] 
Unicode Decode Error: 'charmap' codec cant decode byte 0X9d in position 1102: character maps to 
+0

Вы можете оформить этот сценарий. https://github.com/rajbdilip/json-to-csv-converter тоже. –

ответ

0

Судя по сообщению об ошибке, как представляется, что-то не так с вашим входным файлом. Похоже, json_to_csv_converter.py определил, что кодировка файла - это Windows 1252, но в файле есть один или несколько недопустимых символов, а именно '\x9d', что не является допустимой точкой кода 1252.

Убедитесь, что ваш файл правильно закодирован. Я предполагаю, что файл закодирован в UTF8, но по какой-то причине он обрабатывается, как если бы это была Windows 1252. Вы редактировали файл?

+0

Я не редактировал код json_to_csv_converter. Сначала я получил этот код из: https://github.com/Yelp/dataset-examples/blob/master/json_to_csv_converter.py, и я просто скопировал и вставил код в файл python и сохранил его в каталоге, где python.exe расположен. Во-вторых, я загрузил файл набора данных yelp и сохранил его в том же каталоге. В-третьих, я открываю командную строку и перехожу в каталог, где находится python, и пишет следующую строку: python json_to_csv_converter.py yelp_academic_dataset.json и получил следующую ошибку. Как вы думаете, я что-то делаю неправильно –

+0

@BengiKoseoglu: Я не вижу ничего, что вы делаете неправильно. Возможно, это связано с тем, как вы распаковывали набор данных? У меня нет доступа к данным, поэтому я не могу сказать, что с ним что-то не так. – mhawke

+0

Я попытался на другом компьютере и попытался распаковать файл по-другому, однако ошибка осталась прежней. Так что я действительно не знаю, что делать. –

1

У вас есть проблема с кодировкой файлов. Вы должны поместить encoding = 'utf8' после открытых функций json-файла, например: with open(json_file_path, encoding='utf8') as fin:

0

Winzip, похоже, как-то калечит. Я работал вокруг этого:

  • Использование 7-Zip для извлечения tar-файла.
  • Редактирование сценария для использования силы в UTF-8 кодировке, так:

    with open(json_file_path, encoding='utf8') as fin: 
    
+0

Можете ли вы рассказать об этом? В частности, можете ли вы объяснить, что вы имеете в виду под «проблемой» (какая проблема?) И «извлечением в правильном направлении» (что, собственно, является правильным способом?)? – EJoshuaS

+0

@EJoshuaS, я получил ту же ошибку unicode, о которой говорилось выше. Тогда я узнал, что не смог извлечь tar-файл в строгом соответствии. Я не смог извлечь файл tar-файла с помощью winzip. Когда я использовал 7-zip, он работал. Когда вы извлекаете tar-файл, вы должны увидеть много json-файлов, упомянутых в [link] (https://www.yelp.com/dataset_challenge/dataset). Затем, когда вы открываете json-файл для чтения, если вы используете «с открытым (json_file_path, encoding = 'utf8») в качестве fin:' it willl work :) –

+0

Можете ли вы отредактировать ответ с этим (а не просто иметь его в Комментарии)? – EJoshuaS