我正在阅读一个pandas数据框,并试图用json.dump将其写入一个文件。 这引发了一个错误 – TypeError(repr(o)+“不是json可串行化的”TypeError:5不是JSON可序列化
(链接到错误屏幕截图http://postimg.org/image/lyr539w5p/
下面显示了发生错误的代码块。 这个块中的第3行产生了错误
def write_df_to_json_file(user_array, output_filename): try: fh = open(output_filename, "w") json.dump(user_array, fh) except IOError: util.logit(3, "Error: can\'t find file or read data") else: util.logit(2, str(output_filename) + " file written successful.") fh.close()
输出“user_array”我得到下面的数据。
user_array = {'344': {'216': 4, '215': 3, '213': 4, '297': 4, '684': 4}, '346': {'216': 3, '215': 3, '213': 3, '669': 1, '211': 4, '218': 3, '219': 2, '133': 5, '132': 4, '496': 5, '693': 4, '210': 4, '22': 5, '29': 4, '161': 3, '358': 4}, '347': {'216': 3, '378': 5, '417': 5, '435': 4}}
在Anaconda的OS-X上,代码运行良好。 但在Windows上,它会抛出错误。 我的团队中的另外三名团队成员已经在他们的Windows PC上尝试了这些代码,他们都得到了同样的错误。 他们也有Python 2.7的Anaconda(和我一样)。
为了在Windows PC上做一些故障排除,我们将数据(user_array)复制到一个新的文件(硬编码在主文件中,而不是从源文件中读取),并尝试了一个json.dump。 代码运行没有任何错误! 该文件已成功创build与JSON转储。
我已经在网上search(在stackoverflow以及其他网站),虽然人们已经面临这个错误,他们通常有一个字典对象,不能被JSON倾倒。 在我的情况下,即使这是一个字典对象,它在OS-X上运行。 所以我认为OS-X上的对象没有问题。
OS-X和Windows之间有什么特别的区别导致这个错误? 我如何解决这个问题在Windows上? 因为,如果他们不能在Windows上运行代码,我的团队不能帮助开发。
– – – – – – – – 附加信息 – – – – – –
添加最终调用此function块的块。 read_csv_to_json是第一个被调用的函数。 然后依次调用剩下的(按顺序显示),以write_df_to_json结尾,我得到错误。 有一点,在这个阶段的初期,我们在从csv读取input文件后做了一个简单的json.dump,在mac和windows上运行的很好。 一个星期后,当我们拥有所有这些parsing函数时,出现这个错误。 不知道这是否是有用的信息
阅读csv文件
def read_csv_to_json(filename, separator, colnames): df_ratings = read_csv(filename, separator, colnames) holdout_split(df_ratings) def read_csv(filename, separator, colnames): # read the full u data set containing 100000 ratings by 943 users on 1682 items data_ratings = pd.read_csv(filename, sep =separator, header = None, names = colnames) return data_ratings def holdout_split(df_ratings): train, test = train_test_split(df_ratings, test_size = 0.2) parse_df_to_usercf_json(train, file_holdout_utrain) parse_df_to_usercf_json(test, file_holdout_utest) parse_df_to_itemcf_json(train, file_holdout_itrain) parse_df_to_itemcf_json(test, file_holdout_itest) def parse_df_to_usercf_json(data_ratings, output_filename): data_ratings_sorted = data_ratings.sort_values(user_sort_colname) # sort the data_ratings using the sort_colname # get distinct_userId sorted by User_id distinct_userId = sorted(pd.unique(data_ratings_sorted.user_id.ravel())) # Setting up counters to slice the dataframe for subgroups based on same userid user_marker = 0 rowCounter = 0; rowcount = len(data_ratings_sorted.index) user_array = {} # Slicing the dataframe based on rows with the same userid and storing as dict objects for user in distinct_userId: # for each distinct user movie_details = {} for index_j, row_j in data_ratings_sorted[user_marker: rowcount].iterrows(): # dataframe is sliced using a user_marker that is set to beginning of the current distinct user rowCounter += 1 # point rowcounter to next row if user == row_j['user_id']: # till the userj in current row matches the current distinct user in the top loop movie_details[str(row_j['movie_id'])]=(row_j['rating']) # create a key value pair {movie id : rating} else: # if userid in current row doesnt match the distinct user in the top loop rowCounter = rowCounter - 1 # retreat the rowcounter one step back user_marker = rowCounter # set user_marker to the next distinct user id user_array[str(user)] = movie_details # store the userid and movie details as {user_id1: {movie_id,movie_rating}} break; # skip to next distinct user (back to top loop) # write the final dictionary object/array to json file write_df_to_json_file(user_array, output_filename)