Python:将特殊文件解压到内存中并将其放入DataFrame中
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数组。
我知道这可能是一个难以回答的问题,因为你没有文件可以尝试和查看发生了什么。但如果有人有任何想法,我会很高兴听到。:)非常感谢!
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格式的问题。希望对大家有所帮助。