繁体   English   中英

将文件夹中的多个json文件解压缩到pandas df

[英]Unzipping multiple json files from folder into pandas df

我有一个文件夹,里面装满了用 gzip 压缩的 json 文件(~10gb,主要是文本数据)。 我目前的代码可以工作,但速度很慢(想想几个小时):

from glob import glob
filenames = glob('folder_path/*')
dataframes = [pd.read_json(f, compression='gzip') for f in filenames]

我希望找到一种更快的方法来解压缩所有文件,并将每个文件保存到一个 Pandas df 或将它们全部保存到一个 df(此时 1 对多个 dfs 对我来说并不重要)。 我读过zlib但这似乎不适用于 gzip 文件? 我也在那里尝试了一些不同的东西,但似乎都不起作用,例如:

filenames = glob('folder_path/*')
jsonobjs = [gzip.open(f, 'rb') for f in filenames]

返回:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-12-a5a84131bb38> in <module>
      1 filenames = glob('folder_path/*')
----> 2 jsonobjs = [gzip.open(f, 'rb') for f in filenames]

<ipython-input-12-a5a84131bb38> in <listcomp>(.0)
      1 filenames = glob('folder_path/*')
----> 2 jsonobjs = [gzip.open(f, 'rb') for f in filenames]

~/anaconda3/lib/python3.7/gzip.py in open(filename, mode, compresslevel, encoding, errors, newline)
     51     gz_mode = mode.replace("t", "")
     52     if isinstance(filename, (str, bytes, os.PathLike)):
---> 53         binary_file = GzipFile(filename, gz_mode, compresslevel)
     54     elif hasattr(filename, "read") or hasattr(filename, "write"):
     55         binary_file = GzipFile(None, gz_mode, compresslevel, filename)

~/anaconda3/lib/python3.7/gzip.py in __init__(self, filename, mode, compresslevel, fileobj, mtime)
    161             mode += 'b'
    162         if fileobj is None:
--> 163             fileobj = self.myfileobj = builtins.open(filename, mode or 'rb')
    164         if filename is None:
    165             filename = getattr(fileobj, 'name', '')

OSError: [Errno 24] Too many open files: 'folder_path/d2ea1c35275b495fb73cb123cdf4fe4c'

with gzip.open(glob('folder_path/*'), 'rb') as f:
    file_content = f.read()

返回:

TypeError                                 Traceback (most recent call last)
<ipython-input-10-bd68570238cd> in <module>
----> 1 with gzip.open(glob('folder_path/*'), 'rb') as f:
      2         file_content = f.read()

TypeError: 'module' object is not callable

所以这:

with gzip.open('single_file', 'rb') as f:
    file_content = f.read()
pd.read_json(file_content)

工作得很好,并且比将 compression='gzip' 传递给 pd.read_json 更快,但我不知道如何让它适用于所有文件。

编辑:尝试了以下方法:

for file_name in glob('folder_path/*'):
     with [gzip.open(f, 'rb') for f in filenames]:
            file_name = pd.read_json(f)

但这会返回相同的too many open files错误

我已经对 OP 进行了一些更改以解决初步回溯,这应该允许 OP 使这个过程在较小的数据集上工作。 然而,真正的问题是数据集太大而无法真正做到这一点。 由于目标是训练 LDA 模型,我建议 OP 查看支持在线学习的库,以便可以在没有不可能的内存占用的情况下构建模型。

这不是对“将多个 json 文件从文件夹解压缩到 Pandas df”这一更一般主题的答案,但这并不是真正的主要问题。 以下(未经测试)代码可以遍历文件夹中的 gzipped 文件并将每个文件读入数据帧。 然后根据需要连接或处理这些数据帧。

from glob import glob
import gzip

for fname in glob('folder_path/*gz'):
    with gzip.open(fname, 'rb') as f:
        df = pd.read_json(f)

请注意,使用 Pandas 对许多文件执行此操作非常慢。 您最好阅读和解析原始 JSON 结构,根据需要清理/转换它们,然后在所有组合数据(或数据块​​)上形成最终的 Pandas 数据帧。 或者,如果不是真正必要,则完全避免使用熊猫。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM