Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将特殊文件解压缩到内存中,并将其放入数据帧_Python_Numpy_Unzip_Zipfile - Fatal编程技术网

Python:将特殊文件解压缩到内存中,并将其放入数据帧

Python:将特殊文件解压缩到内存中,并将其放入数据帧,python,numpy,unzip,zipfile,Python,Numpy,Unzip,Zipfile,我一直在用Python编写代码,我是一个初学者,可能真的很容易,但我就是看不见。任何帮助都将不胜感激。所以先谢谢你:) 问题是:我必须将一些具有特殊扩展名.fen的特殊数据文件读入熊猫数据帧中。这些.fen文件位于压缩文件.fenx中,其中包含.fen文件和.cfg配置文件 在我编写的代码中,我使用zipfile库来解压文件,然后将它们放入数据帧中。此代码如下所示 import zipfile import numpy as np import pandas as pd def readfen

我一直在用Python编写代码,我是一个初学者,可能真的很容易,但我就是看不见。任何帮助都将不胜感激。所以先谢谢你:)

问题是:我必须将一些具有特殊扩展名.fen的特殊数据文件读入熊猫数据帧中。这些.fen文件位于压缩文件.fenx中,其中包含.fen文件和.cfg配置文件

在我编写的代码中,我使用zipfile库来解压文件,然后将它们放入数据帧中。此代码如下所示

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文件放入内存,而不是硬盘

我尝试过类似于zipfile库中的
fenxzip.read('whateverthenameoffileis.fen')
和一些其他方法,如
.open()
。但是我无法以我尝试过的方式将
.read()
返回到numpy数组中的内容获取


我知道这可能是一个很难回答的问题,因为你没有文件来尝试看看会发生什么。但是,如果有人有什么想法,我会很乐意阅读多谢各位

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

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

也许这另一个答案会有所帮助:。一旦在内存中有了ZipFile,就可以使用支持文件格式的BytesIO,并在np中使用它来获取数组。但是,正如您所提到的,如果您的zip文件太大,需要很长时间才能解压缩到磁盘,那么我不确定在内存中执行同样的操作是否真的方便,您可能会导致进程占用太多时间,以至于内核会决定终止它?请备份一点。关注一个文件。它是如何编写的,匹配的读取方法是什么?先让它工作,然后再担心处理压缩和大量文件。@mydaemon
myzip=zipfile.zipfile(io.BytesIO(open(Directory)))readfile=myzip.open(File[:-5]+'.fen')
这就是我试图用io.Bytes实现它的方法,但我真的不知道如何正确打开该文件,以便BytesIO接收它。@hpaulji所有这3个文件都是由另一个人“发明”的,我将尝试看看他有什么问题,也许他可以帮我。问题是,用我发布的代码打开它们没有问题,但我无法用内存而不是硬内存来做完全相同的事情drive@edumugi,我会尽量用真实的答案回答你最后的评论。