在 csv 文件中分离二进制数据 (blob)
Separate binary data (blobs) in csv files
在(伪)csv 文件中是否有任何安全的方法将二进制数据与文本数据混合?
一个天真的和部分解决方案是:
- 使用由多个字符组成的复合字段分隔符(例如
\a\b
序列)
- 将每个字段保存为文本或二进制数据需要 pseudocsv 的解析器查找
\a\b
序列并根据已知规则读取分隔符之间的数据(例如通过已知 header 具有字段名称和字段类型,例如)
核心问题是不能保证二进制数据在其 body 内部某处不包含 \a\b
序列,在数据的实际结束之前。
正确的解决方案是将各个 blob 字段保存在它们自己单独的物理文件中,并且只将文件名包含在 .csv 中,但这在这种情况下是不可接受的。
鉴于这些限制,是否有任何适当且安全的解决方案(已经实施或适用)?
如果您需要单个文件中的所有内容,只需使用其中一种方法将二进制编码为可打印的 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 解码 - 但它肯定比尝试创建一个临时转义方法要好。
在(伪)csv 文件中是否有任何安全的方法将二进制数据与文本数据混合?
一个天真的和部分解决方案是:
- 使用由多个字符组成的复合字段分隔符(例如
\a\b
序列) - 将每个字段保存为文本或二进制数据需要 pseudocsv 的解析器查找
\a\b
序列并根据已知规则读取分隔符之间的数据(例如通过已知 header 具有字段名称和字段类型,例如)
核心问题是不能保证二进制数据在其 body 内部某处不包含 \a\b
序列,在数据的实际结束之前。
正确的解决方案是将各个 blob 字段保存在它们自己单独的物理文件中,并且只将文件名包含在 .csv 中,但这在这种情况下是不可接受的。
鉴于这些限制,是否有任何适当且安全的解决方案(已经实施或适用)?
如果您需要单个文件中的所有内容,只需使用其中一种方法将二进制编码为可打印的 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 解码 - 但它肯定比尝试创建一个临时转义方法要好。