簡體   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