在Python中读取大量的json文件?

TJa*_*ain 6 python json pandas

这不是关于读取大型JSON文件,而是以最有效的方式读取大量JSON文件.

我正在使用Million歌曲数据集中的last.fm数据.数据以一组JSON编码的文本文件的形式提供,其中的键是:track_id,artist,title,timestamp,similars和tags.

目前,我读他们到下列方式大熊猫经历几个选项,因为这是最快的,如图后在这里:

import os
import pandas as pd
try:
    import ujson as json
except ImportError:
    try:
        import simplejson as json
    except ImportError:
        import json


# Path to the dataset
path = "../lastfm_train/"

# Getting list of all json files in dataset
all_files = [os.path.join(root,file) for root, dirs, files in os.walk(path) for file in files if file.endswith('.json')] 

data_list=[json.load(open(file)) for file in all_files]
df = pd.DataFrame(data_list, columns=['similars', 'track_id'])
df.set_index('track_id', inplace=True)
Run Code Online (Sandbox Code Playgroud)

当前方法读取子集(在不到一秒的时间内完整数据集的1%).然而,读满车组的速度太慢,永远需要(我已经等了几个小时也一样)来读取,并已成为如所示进一步任务的瓶颈问题在这里.

我也在ujson解析json文件时用于速度目的,这里显然可以从这个问题看到

更新1 使用生成器理解而不是列表理解.

data_list=(json.load(open(file)) for file in all_files)
Run Code Online (Sandbox Code Playgroud)

art*_*hur 0

我会在文件和yield你想要的两列上构建一个迭代器。

然后你可以DataFrame用该迭代器实例化 a 。

import os
import json
import pandas as pd

# Path to the dataset
path = "../lastfm_train/"

def data_iterator(path):
    for root, dirs, files in os.walk(path):
        for f in files:
            if f.endswith('.json'):
                fp = os.path.join(root,f)
                with open(fp) as o:
                    data = json.load(o)
                yield {"similars" : data["similars"], "track_id": data["track_id"]}


df = pd.DataFrame(data_iterator(path))
df.set_index('track_id', inplace=True)
Run Code Online (Sandbox Code Playgroud)

这样,您只需检查文件列表一次,并且在将其传递给之前和之后就不会重复数据DataFrame