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

9 浏览
0 Comments

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

我在编写Python代码时遇到了困难,作为一个初学者,可能问题很简单,但我就是看不出来。非常感谢提前的帮助:)

问题如下:我需要将一些具有特殊扩展名.fen的数据文件读入pandas DataFrame中。这些.fen文件位于一个名为.fenx的压缩文件中,压缩文件中包含.fen文件和一个.cfg配置文件。

在我编写的代码中,我使用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读取.cfg文件并返回一些重要的数据。
    #这里只有cfgDtypes很重要,因为它包含了.fen文件中的数据类型,并且将成为最终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('文件名.fen')`的方法,以及zipfile库中的`.open()`方法。但是我无论如何都无法将`.read()`返回的内容转换为numpy数组。

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

0
0 Comments

Python: 解压特殊文件到内存并将其转化为DataFrame

近日,我遇到了一个问题,需要将特殊类型的文件解压缩到内存中,并将其转化为DataFrame格式。经过一番探索,我终于找到了解决方案。下面是我找到的代码解决方案:

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

这段代码通过使用tempfile库在内存中创建一个临时对象来解决问题。其中,`readfenxfile`函数接受三个参数:`Directory`表示文件所在目录,`File`表示要解压缩的文件名,`ExtractDirectory`表示解压缩后的目录。

在函数内部,首先使用`zipfile.ZipFile`打开要解压缩的文件,并将其存储在`fenxzip`变量中。然后,使用`tempfile.SpooledTemporaryFile`创建一个临时文件对象`fenfile`,并设置最大大小为10GB。接着,通过`fenxzip.read`读取要解压缩的文件内容,并将其写入到`fenfile`对象中。

接下来,调用`readCfgFile`函数读取配置文件,并将返回的结果存储在`cfgGeneral`、`cfgDevice`、`cfgChannels`和`cfgDtypes`变量中。

如果`cfgChannels`不为空,表示存在通道配置信息,我们将使用`eval`函数将`cfgDtypes`字符串转化为NumPy数据类型。然后,通过`fenfile.seek(0)`将文件指针移动到文件开头,调用`np.fromfile`将文件内容读取为NumPy数组,并指定数据类型为`dtDtype`。最后,将数组转化为DataFrame格式,并存储在`dt`变量中。

如果`cfgChannels`为空,表示不存在通道配置信息,我们将`dt`设置为空列表。

最后,关闭`fenfile`和`fenxzip`对象,并返回`dt`、`cfgChannels`和`cfgDtypes`三个变量。

这段代码解决了将特殊类型的文件解压缩到内存中,并将其转化为DataFrame格式的问题。希望对大家有所帮助。

0