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

2024-04-24 20:50:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我希望找到一种更快的方法来解压所有文件,并将每个文件一个一个地保存到一个df,或将所有文件保存到一个df(此时,1对多个df对我来说并不重要)。我读过关于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错误


Tags: 文件pathinjsonforreadmodeopen
1条回答
网友
1楼 · 发布于 2024-04-24 20:50:51

我已经引导OP完成了一些更改,以解决初步的回溯问题,这应该允许OP在较小的数据集上运行此过程。然而,真正的问题是数据集太大,无法真正做到这一点。由于目标是训练LDA模型,我建议OP调查支持在线学习的图书馆,这样模型就可以在没有不可能的内存占用的情况下建立起来

这并不是对“将多个json文件从文件夹解压缩到文件夹”这一更一般主题的回答,但这并不是真正的主要问题。以下(未测试的)代码可以在文件夹中的gzip文件上循环,并将每个文件读入数据帧。然后concat或根据需要处理这些数据帧

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结构,根据需要清理/转换它们,然后在所有组合数据(或数据块)上形成最终的数据帧。或者,如果不是真的有必要的话,完全避免熊猫

相关问题 更多 >