![](/img/trans.png)
[英]Python read .json files from GCS into pandas DF in parallel
[英]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.