文本输出到临时文件,与Python 2.7兼容?
我想有一种方法将Unicode文本输出写入使用文本输出到临时文件,与Python 2.7兼容?,python,python-2.7,unicode,character-encoding,newline,Python,Python 2.7,Unicode,Character Encoding,Newline,我想有一种方法将Unicode文本输出写入使用tempfileAPI创建的临时文件,该文件支持Python 3风格的编码和换行符转换选项,但也适用于Python 2.7(用于Unicode值) 要打开具有常规可预测名称的文件,可通过io.open提供一种可移植的方式。但对于临时文件,安全的方法是获取文件的操作系统句柄,以确保文件名不会被并发恶意进程劫持。没有与tempfile.NamedTemporaryFile或os.fdopen类似的io工作,在Python 2.7上,通过这种方式获得的文件
tempfile
API创建的临时文件,该文件支持Python 3风格的编码和换行符转换选项,但也适用于Python 2.7(用于Unicode
值)
要打开具有常规可预测名称的文件,可通过io.open
提供一种可移植的方式。但对于临时文件,安全的方法是获取文件的操作系统句柄,以确保文件名不会被并发恶意进程劫持。没有与tempfile.NamedTemporaryFile
或os.fdopen
类似的io
工作,在Python 2.7上,通过这种方式获得的文件对象存在问题:
- 内置文件对象不能被支持编码和换行转换的
包装李>io.TextIoWrapper
API可以生成编码编写器,但不执行换行转换。底层文件必须以二进制模式打开,否则在Python3中会出现相同的代码中断(通常,在任意字符编码的数据上期望正确的换行转换是不明智的)编解码器
io按名称重新打开文件。打开。使用NamedTemporaryFile
时,这意味着delete
构造参数必须设置为false,用户有责任在不再需要时删除该文件。另外还有一个附加的安全隐患,在非常罕见的情况下,创建临时文件的目录可写入潜在的攻击者,并且粘滞位未设置在其权限模式位中
newline
参数创建的io.StringIO
缓冲区(视情况而定),然后将缓冲的字符串写入从codecs
获取的编码写入器。这对大文件的性能和内存使用都是不利的还有其他选择吗?在文件对象/描述符上调用
close
(不删除文件),然后使用io重新打开文件。open
仅比使用mkstemp
打开的描述符稍微不安全。在权限中有粘性位的目录中,没有其他非根进程可以劫持该文件,而且在没有粘性位的世界可写目录中创建安全敏感文件是非常罕见的。我将编辑问题文本来解决这个问题。