将文件解密为流并将流读入 p​​andas(hdf 或 stata)

2024-01-18

概述我正在尝试做的事情。我有需要读入 pandas 的文件的加密版本。由于多种原因,解密到流而不是文件要好得多,所以这是我下面的兴趣,尽管我也尝试解密到文件只是作为中间步骤(但这也不起作用)。

我可以让它适用于 csv,但不适用于 hdf 或 stata(我接受适用于 hdf 或 stata 的答案,尽管两者的答案可能相同,这就是为什么我合并为一个问题)。

加密/解密文件的代码取自另一个stackoverflow问题(我目前找不到)。

import pandas as pd
import io
from Crypto import Random
from Crypto.Cipher import AES

def pad(s):
    return s + b"\0" * (AES.block_size - len(s) % AES.block_size)

def encrypt(message, key, key_size=256):
    message = pad(message)
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return iv + cipher.encrypt(message)

def decrypt(ciphertext, key):
    iv = ciphertext[:AES.block_size]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = cipher.decrypt(ciphertext[AES.block_size:])
    return plaintext.rstrip(b"\0")

def encrypt_file(file_name, key):
    with open(file_name, 'rb') as fo:
        plaintext = fo.read()
    enc = encrypt(plaintext, key)
    with open(file_name + ".enc", 'wb') as fo:
        fo.write(enc)

def decrypt_file(file_name, key):
    with open(file_name, 'rb') as fo:
        ciphertext = fo.read()
    dec = decrypt(ciphertext, key)
    with open(file_name[:-4], 'wb') as fo:
        fo.write(dec)

这是我尝试扩展代码以解密为流而不是文件。

def decrypt_stream(file_name, key):
    with open(file_name, 'rb') as fo:
        ciphertext = fo.read()
    dec = decrypt(ciphertext, key)
    cipherbyte = io.BytesIO()
    cipherbyte.write(dec)
    cipherbyte.seek(0)
    return cipherbyte 

最后,这是包含示例数据的示例程序,试图使其工作:

key = 'this is an example key'[:16]
df = pd.DataFrame({ 'x':[1,2], 'y':[3,4] })

df.to_csv('test.csv',index=False)
df.to_hdf('test.h5','test',mode='w')
df.to_stata('test.dta')

encrypt_file('test.csv',key)
encrypt_file('test.h5',key)
encrypt_file('test.dta',key)

decrypt_file('test.csv.enc',key)
decrypt_file('test.h5.enc',key)
decrypt_file('test.dta.enc',key)

# csv works here but hdf and stata don't
# I'm less interested in this part but include it for completeness
df_from_file = pd.read_csv('test.csv')
df_from_file = pd.read_hdf('test.h5','test')
df_from_file = pd.read_stata('test.dta')

# csv works here but hdf and stata don't
# the hdf and stata lines below are what I really need to get working
df_from_stream = pd.read_csv( decrypt_stream('test.csv.enc',key) )
df_from_stream = pd.read_hdf( decrypt_stream('test.h5.enc',key), 'test' )
df_from_stream = pd.read_stata( decrypt_stream('test.dta.enc',key) )

不幸的是,我认为我不能再缩小这段代码并且仍然有一个完整的示例。

再次,我希望所有 4 个非工作行都能正常工作(hdf 和 stata 的文件和流),但我很高兴接受仅适用于 hdf 流或仅适用于 stata 流的答案。

另外,我对其他加密替代方案持开放态度,我只是使用了一些现有的基于 pycrypto 的代码,这些代码是我在 SO 上找到的。我的工作明确需要 256 位 AES,但除此之外我是开放的,因此该解决方案不需要专门基于 pycrypto 库或上面的特定代码示例。

有关我的设置的信息:

python: 3.4.3
pandas: 0.17.0 (anaconda 2.3.0 distribution)
mac os: 10.11.3

最大的问题是填充/取消填充方法。它假定空字符不能是实际内容的一部分。自从stata/hdf文件是二进制的,使用我们使用的额外字节数进行填充(编码为字符)会更安全。该数字将在取消填充期间使用。

也暂时来说,read_hdf不支持从文件之类的对象中读取,即使 API 文档声明如此。如果我们将自己限制在stata格式,以下代码将执行您需要的操作:

import pandas as pd
import io
from Crypto import Random
from Crypto.Cipher import AES

def pad(s):
    n = AES.block_size - len(s) % AES.block_size
    return s + n * chr(n)

def unpad(s):
    return s[:-ord(s[-1])]

def encrypt(message, key, key_size=256):
    message = pad(message)
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return iv + cipher.encrypt(message)

def decrypt(ciphertext, key):
    iv = ciphertext[:AES.block_size]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = cipher.decrypt(ciphertext[AES.block_size:])
    return unpad(plaintext)

def encrypt_file(file_name, key):
    with open(file_name, 'rb') as fo:
        plaintext = fo.read()
    enc = encrypt(plaintext, key)
    with open(file_name + ".enc", 'wb') as fo:
        fo.write(enc)

def decrypt_stream(file_name, key):
    with open(file_name, 'rb') as fo:
        ciphertext = fo.read()
    dec = decrypt(ciphertext, key)
    cipherbyte = io.BytesIO()
    cipherbyte.write(dec)
    cipherbyte.seek(0)
    return cipherbyte

key = 'this is an example key'[:16]

df = pd.DataFrame({
    'x': [1,2],
    'y': [3,4]
})

df.to_stata('test.dta')

encrypt_file('test.dta', key)

print pd.read_stata(decrypt_stream('test.dta.enc', key))

Output:

   index  x  y
0      0  1  3
1      1  2  4

在 python 3 中,您可以使用以下命令pad, unpad版本:

def pad(s):
    n = AES.block_size - len(s) % AES.block_size
    return s + bytearray([n] * n)

def unpad(s):
    return s[:-s[-1]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文件解密为流并将流读入 p​​andas(hdf 或 stata) 的相关文章

  • Seaborn regplot 中点和线的不同颜色

    中列出的所有示例西伯恩的regplot文档 https seaborn pydata org generated seaborn regplot html点和回归线显示相同的颜色 改变color争论改变了两者 如何为点设置与线不同的颜色 你
  • 从 Python 将分层 JSON 数据写入 Excel xls?

    我想将一些数据从 python 写入 xlsx 我目前将其存储为 JSON 但它从 Python 中输出什么并不重要 单个文章的 JSON 如下所示 Word Count 50 Key Words Blah blah blah Foo Fr
  • 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

    我正在尝试将补丁的相同实例添加到 matplotlib 中的多个轴 这是最小的例子 import matplotlib pyplot as mpl plt import matplotlib patches as mpl patches f
  • 从 Spark 数据帧中过滤大量 ID

    我有一个大型数据框 其格式类似于 ID Cat date 12 A 201602 14 B 201601 19 A 201608 12 F 201605 11 G 201603 我需要根据大约 500 万个 Is 的列表来过滤行 最直接的方
  • 监控培训课程如何运作?

    我试图理解使用之间的区别tf Session and tf train MonitoredTrainingSession 以及我可能更喜欢其中之一 似乎当我使用后者时 我可以避免许多 杂务 例如初始化变量 启动队列运行程序或设置文件编写器以
  • 如何在python mechanize中设置cookie

    向服务器发送请求后 br open http xxxx br select form nr 0 br form MESSAGE 1 2 3 4 5 br submit 我得到了响应标题 其中包含 set cookie Set Cookie
  • 为什么在 __init__ 函数中声明描述符类会破坏描述符功能?

    在下面的 B 类中 我想要 set 每当您赋值给 A 类中的函数时 就会调用该函数B a 相反 将值设置为B a覆盖B a与价值 C类分配给C a工作正常 但我想为每个用户类都有一个单独的 A 实例 即我不想在 C 的一个实例中更改 a 来
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • Scapy:如何将新层(802.1q)插入现有数据包?

    我有一个数据包转储 想要将 VLAN 标记 802 1q 标头 注入到数据包中 怎么做 为了找到答案 我查看了Scapy 插入新层和记录问题 https stackoverflow com q 17259592 1381638 这确实很有帮
  • 如何在VS code终端中激活python虚拟环境?

    我使用 VS 代码编辑器创建了一个 python 虚拟环境 虚拟环境已成功创建 但我无法激活它 当我尝试激活我的虚拟环境时 我也尝试过 activate bat 我试图在 PowerShell 中激活虚拟 env 命令 该命令默认在 VS
  • 如何使用 numpy 从一维数组创建对角矩阵?

    我正在使用 Python 和 numpy 来做线性代数 我表演了numpy对矩阵进行 SVD 以获得矩阵 U i 和 V 然而 i 矩阵表示为 1 行的 1x4 矩阵 IE 12 22151125 4 92815942 2 06380839
  • Python 可选参数对

    我正在使用argparse模块获取两个可选的命令行参数 parser add argument start date nargs metavar START DATE help start date in YYYY MM DD parser
  • 如何使用 Python 实现并行 gzip 压缩?

    使用python压缩大文件 https stackoverflow com questions 9518705 big file compression with python给出了一个很好的例子来说明如何使用例如bz2 纯粹用 Pytho
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • 获取 python 模块的 2 个独立实例

    我正在与以非 OO 方式编写的 python 2 x API 进行交互 它使用模块全局范围来处理一些内部状态驱动的东西 在它不再是单例的情况下需要它 并且修改原始代码 不是我们的 不是一个选择 如果不使用单独解释器的子进程运行 有什么方法可
  • datetime strftime 不输出正确的时间戳

    下列 gt gt gt from dateutil parser import parse gt gt gt parse 2013 07 02 00 00 00 0000 datetime datetime 2013 7 2 0 0 tzi
  • 访问影子 DOM 中的元素

    是否有可能查找 Shadow DOM 中的元素与蟒蛇硒 示例用例 我有这个input with type date
  • 如何正确将 tflite_graph.pb 转换为 detector.tflite

    我正在使用tensorflow对象检测API使用tensorflow中的ssdlite mobilenet v2 coco 2018 05 09来训练自定义模型模型动物园 https github com tensorflow models
  • gnuplot:第 1 行:无效命令

    stackoverflow 上可爱的人们大家好 我正在尝试使用 gnuplot 绘制数据 我首先阅读表格并提取我想要的数据 我将此数据写入 dat 文件 截至目前 我只是尝试通过命令行绘制它 但会添加必要的代码以在 python 脚本工作后
  • 如何从 python 中的字符串中删除 ANSI 转义序列

    这是包含我的字符串的片段 ls r n x1b 00m x1b 01 31mexamplefile zip x1b 00m r n x1b 01 31m 该字符串是从我执行的 SSH 命令返回的 我无法使用当前状态下的字符串 因为它包含 A

随机推荐

  • 一个目录中有多少个子目录?

    如何查找HDFS中指定目录下的子目录数量 当我做hadoop fs ls mydir 我收到 Java 堆空间错误 因为目录太大 但我感兴趣的是该目录中的子目录数量 我试过 gsamaras gwta3000 hadoop fs find
  • 这个 CASE 表达式如何到达 ELSE 子句?

    我需要将一些测试数据加载到我的帐户表上的通道字段中 Channel 可以是 10 个不同值之一 所以我想我应该使用 a 随机分配 Channel 值之一CASE表达随着ABS CHECKSUM NewId 10像这样 SELECT id n
  • 如何以编程方式将函数添加到嵌套命名空间?

    假设我有一个函数 当我只传递一个字符串时 它会动态地为我创建命名空间 我很确定 YUI JS 库的作用 MyObj namespace fn method name 会导致 MyObj fn method name 正在创建 所有三个级别都
  • 如何使用此关键字获取 List> ?

    我有片段 我在列表中获取字符串并将其发送为Bundle到活动 例如 我获取一个字符串并通过以下方式将其发送到活动 public class ViewPagerAdapter extends FragmentStatePagerAdapter
  • 使用 ChartJS 更改点击时的点颜色

    目前 当您单击单个点 折线图上 时 我可以更改它的颜色 但它会立即变回以前的颜色 我该如何防止这种情况发生 这是我的功能 var options onClick function e var element this getElementA
  • MongoDB 查找所有数组元素等于某个值的文档

    收藏 db test find id ObjectId arr Today is null id ObjectId arr null null null 我试图找到所有文件arr等于某个值 在此示例中 我想要包含以下内容的文档arr nul
  • 如何在 Mac 终端中使用 g++?

    我已经安装了 Xcode 并且可以在 Xcode 中编译 cpp 文件 但是 我想在终端中使用 g 但找不到命令 g now 我的操作系统是 Mountain Lion Xcode 版本是 4 4 您需要从以下位置下载并安装 OSX Mou
  • 在 Android 中显示 SVG 文件

    我想创建一个应用程序来显示某些平面图上的位置 导航是通过 WiFi 以某种方式实现的 我已经做到了 所以现在我遇到了显示平面图的问题 它可能是某种矢量格式 在网上冲浪一段时间后我决定它必须是 svg 文件 我找到了一些解决方案 但它对我不起
  • UITextView 在 tvOS 中不滚动

    我有一个UITextView在我的电视应用程序中 当我尝试使其可聚焦时 用户界面无法使其可聚焦 并且我无法滚动它 我读到了一些有关它的问题 有些人说这是一个已知问题 我们应该使用故事板 实际上我正在使用故事板 但仍然无法让它发挥作用 我也曾
  • 如何在共享服务器上部署 Laravel-Vue 项目 (GoDaddy)

    这是我第一次开发Laravel Vue app 当我使用php artisan serve 一切正常 但是当我加载它时http localhost myProject public 资产未加载 我的图像在imgpublic 文件夹内的目录
  • 我如何将运行时依赖传递给 Hilt 模块?

    我希望创建一个Retrofit通过带有运行时的 Hilt 模块的实例baseUrl 我怎样才能提供baseUrl到希尔特模块 图表示例 use case gt repository gt api gt retrofit gt 你能帮助我吗
  • 仅返回 xpath 中元素的文本(python / lxml)

    我有一个像这样的 XML 结构 mytree
  • 使用 R 循环日期

    我需要在 R 中编写一些代码 通过循环日期来构建字符串 但我似乎无法在我的书中或通过谷歌搜索找到这样的示例 基本上 for theDate 1Jan14 to 31Dec14 http website com api theDate 我考虑
  • Eclipse IDE - Android 图形布局和 XML 布局并排

    是否可以将 Android 图形布局放在 Android XML 布局旁边 以便我可以同时修改两者 更改 XML 并立即看到效果会比一直单击选项卡进行更改要好得多 是的 虽然我刚刚尝试过 但在图形布局编辑器中更改某些内容后 它有一点滞后 打
  • 模板方法模式中每个实现需要不同的参数?

    我有一个基抽象类 需要一个身份验证算法 我有两种实现方式 一种将散列密码并将其与存储的散列进行比较 另一种将使用 Windows Active Directory 但在实际执行哈希检查或 Windows 身份验证之前 我必须绝对实现额外的工
  • 阻止一个表单提交,然后提交另一个表单 - 这种方法可靠吗?

    在一个表单的提交事件处理程序中提交另一个表单并返回是否安全false阻止提交第一份表格 form1 submit function form2 submit return false 我正在使用这种方法 并且它有效 至少在 IE6 中 但是
  • 如何在不使用 WinjS 库的情况下在通用 Windows 应用程序中添加后退按钮事件?

    这是我的 main js function use strict No need of WinJS var activation Windows ApplicationModel Activation var roaming Windows
  • 如何查看android数据库(SQLite)中保存的数据?

    我可以从 eclipse 查看数据库 来自文件管理器 但我想查看整个详细信息 我的意思是我插入的数据 但我无法查看 我的 Android 完整安装已经完成F Drive 您可以使用模拟器的 DDMS 访问此文件夹 除非您有 root 设备
  • Json 字符串反序列化为对象数组列表

    请帮忙 反序列化时出现此错误 无法将 System String 类型的对象转换为类型 系统 集合 通用 列表 来自客户端的 JSON 字符串 id 18 0 2 0 and 您可以输入自由文本来代替 id 23 1 3 1 and 刷新按
  • 将文件解密为流并将流读入 p​​andas(hdf 或 stata)

    概述我正在尝试做的事情 我有需要读入 pandas 的文件的加密版本 由于多种原因 解密到流而不是文件要好得多 所以这是我下面的兴趣 尽管我也尝试解密到文件只是作为中间步骤 但这也不起作用 我可以让它适用于 csv 但不适用于 hdf 或