csv文件中

时间:2016-08-31 15:07:30

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

在(伪)csv文件中是否存在将二进制文件与文本数据混合的安全方法?

一个天真和部分的解决方案是:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

一种这样的方法是base64 - 但即使在Python的base64编解码器上,也有更高效的编解码器,如base85(在更新的Pythons,版本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解码 - 但它肯定比尝试创建ad-hoc转义方法更好。