【问题标题】:Can you convert file contents to a file object?您可以将文件内容转换为文件对象吗?
【发布时间】:2013-08-20 00:33:09
【问题描述】:

我有一个函数需要一个文件对象,简化示例:

def process(fd):
    print fd.read()

通常被称为:

fd = open('myfile', mode='r')
process(fd)

我无法更改此功能,并且我已经在内存中拥有文件的内容。有没有办法convert 将文件内容写入文件对象而不将其写入磁盘,所以我可以这样做:

contents = 'The quick brown file'
fd = convert(contents) # ??
process(fd)

【问题讨论】:

    标签: python string file file-io


    【解决方案1】:

    如果您对“类文件对象”感到满意,则上述答案有效,其中StringIO 类的对象只是一种特殊情况。然而,StringIO 类的实例不是在 Python 中使用的严格意义上的“文件对象”(即与内置 open 函数返回的东西相同的类型)。 p>

    例如,StringIO 对象 have no fileno method,故意省略了方法:

    fileno() 未实现,因此使用它的代码会触发 早期例外。

    一个可能是严格的“文件对象”而不仅仅是“类文件对象”有几个原因。正如the above 所说,

    使用真实文件通常更快(但不太方便)。

    另一个原因是“类文件”对象(如StringIO 类的对象)不能用作@987654331 的create_subprocess_execstdin 参数的参数@,这是我在 Google 上发现这个问题时想到的用例。这是因为,在 Python 3.7 中,在 subprocess.py 的第 1324 行(定义 asyncio.subprocess 使用的 subprocess 模块),_get_handles 方法试图定义变量 p2cread = stdin.fileno(),显然只有在stdin 首先有一个 fileno 方法。因此,真正的“文件对象”和“类文件对象”(如StringIO 类的实例)之间的区别不仅仅是毫无意义的迂腐。

    以下不是理想的解决方案,但适用于我的目的:

    def string_to_file(string):
        file_object = open('temporary_file.temporary', 'w')
        file_object.write(string)
        file_object.flush()
        return file_object
    

    另一方面,它不能满足您的目的,因为它会写入磁盘。这可能会起作用:

    def string_to_file(string):
        import tempfile
        file_like_object = tempfile.NamedTemporaryFile()
        file_like_object.write(string.encode())
        file_like_object.flush()
        return file_like_object
    

    两者都可以传递给create_subprocess_exec

    【讨论】:

      【解决方案2】:

      您可以使用StringIO

      这个模块实现了一个类似文件的类,StringIO,它读取和 写入一个字符串缓冲区(也称为内存文件)。

      from StringIO import StringIO
      
      def process(fd):
          print fd.read()
      
      contents = 'The quick brown file'
      
      buffer = StringIO()
      buffer.write(contents)
      buffer.seek(0)
      
      process(buffer)  # prints "The quick brown file"
      

      请注意,在 Python 3 中,它已移至 io 包 - 您应该使用 from io import StringIO 而不是 from StringIO import StringIO

      【讨论】:

      • 您可能需要注意,在 Python 3 中,它已被移至 io 模块中。
      猜你喜欢
      • 1970-01-01
      • 2016-08-20
      • 2017-10-21
      • 2020-01-09
      • 1970-01-01
      • 2022-01-19
      • 2023-03-20
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多