Python:将特殊文件解压缩到内存中并将它们放入DataFrame

时间:2017-04-06 14:28:23

标签: python numpy unzip zipfile

我非常厌倦了用Python编写的代码,我是初学者,也许真的很容易,但我看不到它。任何帮助,将不胜感激。所以提前谢谢你:)

问题出在这里:我必须将一些带有特殊扩展名.fen的特殊数据文件读入pandas DataFrame。这个.fen文件位于包含.fen文件和.cfg配置文件的压缩文件.fenx中。

在我编写的代码中,我使用zipfile库来解压缩文件,然后在DataFrame中获取它们。此代码如下

import zipfile
import numpy as np
import pandas as pd

def readfenxfile(Directory,File):

    fenxzip = zipfile.ZipFile(Directory+ '\\' + File, 'r')
    fenxzip.extractall()
    fenxzip.close()

    cfgGeneral,cfgDevice,cfgChannels,cfgDtypes=readCfgFile(Directory,File[:-5]+'.CFG')
    #readCfgFile redas the .cfg file and returns some important data. 
    #Here only the cfgDtypes would be important as it contains the type of data inside the .fen and that will become the column index in the final DataFrame.
    if cfgChannels!=None:        
        dtDtype=eval('np.dtype([' + cfgDtypes + '])')
        dt=np.fromfile(Directory+'\\'+File[:-5]+'.fen',dtype=dtDtype)
        dt=pd.DataFrame(dt)
    else:
        dt=[]

    return dt,cfgChannels,cfgDtypes

现在,extract()方法将解压缩的文件保存在硬盘中。 .fenx文件可能非常大,因此存储(以及之后删除它们)的需求非常慢。我想像现在一样做,但是将.fen和.cfg文件放入内存,而不是硬盘。

我尝试了fenxzip.read('whateverthenameofthefileis.fen')之类的内容以及zipfile库中的.open()等其他方法。但是,无论如何,我无法将.read()返回到一个numpy数组中。

我知道这可能是一个难以回答的问题,因为您没有文件可以尝试查看会发生什么。但如果有人有任何想法,我会很高兴阅读它们。 :)非常感谢你!

1 个答案:

答案 0 :(得分:2)

这是我最终找到的解决方案,以防它对任何人都有帮助。它使用临时文件库在内存中创建临时对象。

import zipfile
import tempfile
import numpy as np
import pandas as pd

def readfenxfile(Directory,File,ExtractDirectory):


    fenxzip = zipfile.ZipFile(Directory+ r'\\' + File, 'r')

    fenfile=tempfile.SpooledTemporaryFile(max_size=10000000000,mode='w+b') 
     fenfile.write(fenxzip.read(File[:-5]+'.fen'))
     cfgGeneral,cfgDevice,cfgChannels,cfgDtypes=readCfgFile(fenxzip,File[:-5]+'.CFG')

    if cfgChannels!=None:        
        dtDtype=eval('np.dtype([' + cfgDtypes + '])')
        fenfile.seek(0)
        dt=np.fromfile(fenfile,dtype=dtDtype)
        dt=pd.DataFrame(dt)
    else:
        dt=[]
    fenfile.close()
    fenxzip.close()    
    return dt,cfgChannels,cfgDtypes