Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文本输出到临时文件,与Python 2.7兼容?_Python_Python 2.7_Unicode_Character Encoding_Newline - Fatal编程技术网

文本输出到临时文件,与Python 2.7兼容?

文本输出到临时文件,与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上,通过这种方式获得的文件

我想有一种方法将Unicode文本输出写入使用
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
    打开的描述符稍微不安全。在权限中有粘性位的目录中,没有其他非根进程可以劫持该文件,而且在没有粘性位的世界可写目录中创建安全敏感文件是非常罕见的。我将编辑问题文本来解决这个问题。