将加密文件读入pandas

5

更新:我已经提出了一个新问题,其中提供了完整的代码示例:将文件解密为流并将流读入pandas(hdf或stata)

我的基本问题是需要保持数据加密,并将其读入pandas。我可以接受各种解决方案,但加密需要使用AES256。目前,我正在使用PyCrypto,但这不是必需品。

我目前的解决方案是:

  1. 解密到临时文件(CSV、HDF等)
  2. 将临时文件读入pandas
  3. 删除临时文件

这远非理想,因为在硬盘上会有一个未加密的文件,如果用户出错可能会比临时文件更长时间存在。同样糟糕的是,IO基本上要增加三倍,因为先写出未加密文件,然后再将其读入pandas。

理想情况下,加密应该内置于HDF或其他二进制格式中,以便pandas可以读取,但据我所知似乎没有。

(注意:这是在linux系统上,因此也许有一个shell脚本解决方案,尽管如果所有操作都可以在python内完成,我可能更喜欢避免使用它。)

其次,而且仍然是一个很大的改进,就是将文件解密到内存中,并直接读入pandas,而不必创建新的(未加密的)文件。到目前为止,我还没有能够做到这一点。

以下是一些伪代码,希望能够说明问题。

# 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提到)的东西,因此我正在探索它们。感谢所有真诚尝试在这里帮助我的人。

你对“次优解”有什么问题? - zaph
啊,我明白了。我对pandas一无所知。我不知道它需要文件名或文件对象。 - Artjom B.
当pandas请求读取时,您可以扩展文件以为您执行解密。 - Mad Physicist
1
重写 https://docs.python.org/3.5/glossary.html#term-file-object 的读取方法。 - Mad Physicist
2
@DSM 好的。我这样做的原因是,当你提出一个编程问题并包含MCVE时,每个人都会忽略问题,只看具体的代码。我同意通常需要一个MCVE,但在这种情况下,我认为没有它更好。我很高兴让大家忽略这个问题或者给出像StringIO和BytesIO这样有用的想法/链接(我会查找它们)。但仅仅因为缺少MCVE就投票关闭这个问题,在我看来不是一个充分的理由,很多好问题都没有MCVE。 - JohnE
显示剩余7条评论
1个回答

2
如果您已经在使用Linux,并且正在寻找一个“简单”的替代方案,不需要在Python级别上进行加密/解密,那么可以使用ext4本地文件系统加密。这种方法可能会使您的安装变得复杂,但具有以下优点:
  • 零泄漏风险通过临时文件。
  • 快速,因为本地加密是用C编写的(尽管PyCrypto也是用C编写的,我猜它在内核级别会更快)。
缺点:
  • 您需要学习如何使用特定的文件系统命令
  • 您当前的Linux内核版本太旧了
  • 您不知道如何升级/无法升级您的Linux内核。
关于将解密后的文件写入内存,您可以使用/dev/shm作为写入位置,从而避免进行复杂的流式传输或覆盖pandas方法。简而言之,/dev/shm使用内存(在某些情况下,您的tmpfs也是如此),比普通硬盘快得多(信息/dev/shm/)。
希望这能对您有所帮助。

谢谢,可能不是我要走的方向,但感谢您的建议。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接