我希望有一种方法可以将Unicode文本输出写入使用tempfile
API创建的临时文件,该文件将支持用于编码和换行转换的Python 3样式选项,但也适用于Python 2.7(对于unicode
值。)
要打开具有常规可预测名称的文件,io.open
提供了一种可移植方式。但对于临时文件,安全的方法是获取文件的操作系统句柄,以确保文件名不会被并发恶意进程劫持。 io
或tempfile.NamedTemporaryFile
没有os.fdopen
个工作,而在Python 2.7上,以这种方式获取的文件对象存在问题:
io.TextIoWrapper
包装; codecs
API可以生成编码编写器,但不执行换行符转换。底层文件必须以二进制模式打开,否则Python 3中的代码会中断(并且通常不希望在任意字符编码数据上进行正确的换行转换)。我提出了两种处理可移植性问题的方法,每种方法都有一些缺点:
关闭文件对象(或操作系统描述符)而不删除文件,并使用io.open
按名称重新打开文件。使用NamedTemporaryFile
时,这意味着必须将delete
构造参数设置为false,并且用户有责任在不再需要时删除该文件。还有一个额外的安全隐患,在相当不寻常的情况下,创建临时文件的目录可写入潜在的攻击者并且粘滞位未在其权限模式位中设置。
将整个输出写入适当的io.StringIO
参数创建的newline
缓冲区,然后将缓冲的字符串写入从codecs
获取的编码编写器中。这对大型文件的性能和内存使用不利。
还有其他选择吗?