将加密文件读入熊猫

时间:2015-12-21 17:00:17

标签: python pandas

更新:我提出了一个新问题,提供完整的代码示例:Decrypting a file to a stream and reading the stream into pandas (hdf or stata)

我的基本问题是我需要保持数据加密然后读入大熊猫。我对各种解决方案持开放态度,但加密需要是AES256。截至目前,我正在使用PyCrypto,但这不是必需的。

我目前的解决方案是:

  1. 解密到临时文件(CSV,HDF等)
  2. 将临时文件读入pandas
  3. 删除临时文件
  4. 这远非理想,因为硬盘上暂时存在未加密的文件,并且由于用户错误,它可能比临时更长。同样糟糕的是,当写出未加密的文件然后读入大熊猫时,IO基本上是三倍。

    理想情况下,加密会内置到HDF或其他一些大熊猫可以读取的二进制格式中,但它似乎并不像我所说的那样。

    (注意:这是在linux盒子上,所以也许有一个shell脚本解决方案,虽然我可能更愿意避免这种情况,如果它可以在python内部完成。)

    第二个最好的,也是一个很大的改进,就是将文件解密到内存中并直接读入大熊猫,而无需创建新的(未加密的)文件。到目前为止,我还没能做到这一点。

    这是一些有希望说明的伪代码。

    # this works, but less safe and IO intensive
    decrypt_to_file('encrypted_csv', 'decrypted_csv')    # outputs decrypted file to disk
    pd.read_csv('decrypted_csv')
    
    # this is what I want, but don't know how to make it work
    # no decrypted file is ever created
    pd.read_csv(decrypt_to_memory('encrypted_csv'))
    

    这就是我正在尝试做的事情,但也对完成同样事情的其他替代方案感兴趣(效率高,不创建临时文件)。

    更新:可能没有直接回答这个问题 - 不要太令人惊讶,但我想我会检查。我认为答案将涉及类似BytesIO(由DSM提及)或mmap(由Mad Physicist提及),所以我正在探索这些。感谢所有在这里真诚帮助的人。

1 个答案:

答案 0 :(得分:2)

如果您已经在使用Linux,并且寻找“简单”替代方案,而不涉及在Python级别加密\ decrypting,则可以使用native file system encryption with ext4

这种方法可能会使您的安装变得复杂,但它具有以下优点:

  • 通过临时文件泄露零风险。
  • 快,因为本机加密是在C中(尽管PyCrypto也在C中,我猜它在内核级别会更快)。

缺点:

  • 您需要学习使用特定的文件系统命令
  • 你当前的linux内核是两个旧的
  • 您不知道如何升级\无法升级您的Linux内核。

至于将解密文件写入内存,您可以使用/dev/shm作为写入位置,从而节省了复杂流式传输或覆盖pandas方法的需要。 简而言之,/dev/shm使用内存(在某些情况下,您的tmpfs也会这样做),并且比普通硬盘驱动器快得多(info /dev/shm/)。

我希望这会对你有所帮助。