在(伪)csv文件中是否存在将二进制文件与文本数据混合的安全方法?
一个天真和部分的解决方案是:
\a\b
序列)\a\b
序列并根据已知规则读取分隔符之间的数据(例如,通过已知标题的方式)例如,使用字段名称和字段类型核心问题是,在数据的实际结束之前,二进制数据不能保证在其正文内某处不包含\a\b
序列。
正确的解决方案是将单个blob字段保存在各自的单独物理文件中,并仅在.csv中包含文件名,但在此方案中这是不可接受的。
是否有任何适当且安全的解决方案,已经实施或适用这些限制?
答案 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转义方法更好。