【问题标题】:Separate binary data (blobs) in csv files在 csv 文件中分离二进制数据(blob)
【发布时间】:2016-08-31 15:07:30
【问题描述】:

是否有任何安全的方法可以将二进制文件与(伪)csv 文件中的文本数据混合?

一个幼稚的部分解决方案是:

  • 使用复合字段分隔符,由多个字符组成(例如,\a\b 序列)
  • 将每个字段保存为文本或二进制数据将需要 pseudocsv 的解析器查找 \a\b 序列并根据已知规则读取分隔符之间的数据(例如,通过带有字段的已知标头例如名称和字段类型)

核心问题是二进制数据不能保证在数据实际结束之前在其主体内的某处不包含\a\b 序列。

正确的解决方案是将各个 blob 字段保存在它们自己单独的物理文件中,并且仅将文件名包含在 .csv 中,但在这种情况下这是不可接受的。

鉴于这些限制,是否有任何适当且安全的解决方案,无论是已经实施还是适用?

【问题讨论】:

  • 一个简单的解决方案是存储二进制数据base64编码。

标签: python csv blob binaryfiles export-to-csv


【解决方案1】:

如果您需要一个文件中的所有内容,只需使用其中一种方法将二进制编码为可打印的 ASCII,然后将该结果添加到 CSV vfieds(让 CSV 模块根据需要添加和转义引号)。

这样的方法之一是base64 - 但即使在 Python 的 base64 编解码器上,也有更高效的编解码器,例如 base85(我猜是在较新的 Python 版本 3.4 及更高版本上)。

因此,Python 2.7 中的一个示例是:

import csv, base64

import random
data = b''.join(chr(random.randrange(0,256)) for i in range(50))

writer = csv.writer(open("testfile.csv", "wt"))
writer.writerow(["some text", base64.b64encode(data)])

当然,您还必须在读取文件时进行正确的 base64 解码 - 但这肯定比尝试创建临时转义方法更好。

【讨论】:

  • 我真的没有想到base64编码!那甚至可以使用经典的 .csv 分隔符!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2011-02-26
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多