在python中将字符串视为文件

时间:2017-06-06 04:04:45

标签: python string io

为了重写开源库,我想将一串文本视为python 3中的文件。

假设我将文件内容作为字符串:

not_a_file = 'there is a lot of blah blah in this so-called file'

我想将此变量(即文件的内容)视为path-like object,我可以在python' s open() function中使用它。

这是一个显示我困境的简单例子:

not_a_file = 'there is a lot of blah blah in this so-called file'
file_ptr = open(not_a_file, 'r')

显然,该示例不起作用,因为not_a_file不是类似路径的对象。我不想写一个文件,也不想为了便携性而创建任何临时目录。

话虽如此,我需要解决这个谜团:

not_a_file = 'there is a lot of blah blah in this so-called file'
... Something goes here ... 
file_ptr = open(also_not_a_file, 'r') 

我迄今为止所做的事

  1. 我已经查看了StringIO,并尝试将其用作类似路径的对象而不是骰子: import StringIO output = StringIO.StringIO() output.write('First line.\n') file_ptr = open(output,'r') 嗯,这不起作用,因为StringIO不是一个类似路径的对象。

  2. 我以类似的方式尝试过tempfile但没有成功。 import tempfile tp = tempfile.TemporaryFile() tp.write(b'there is a lot of blah blah in this so-called file') open(tp,'r')

  3. 最后我尝试了mmap,看看我是否可以将字符串写入内存,然后用open打开内存指针,但没有成功。
  4. 任何帮助表示赞赏! : - )

    编辑1:我想要解决问题

    如果将PurePath初始化为文件,则pathlib.PurePath可以与open()一起使用。也许我可以创建一个继承PurePath的类的实例,当它被open()读取时,它会读取我的字符串。让我举个例子:

    from pathlib import PurePath
    
    not_a_file = 'there is a lot of blah blah in this so-called file'
    class Magic(PurePath):
        def __init__(self, string_input):
            self.file_content = string_input
            PurePath.__init__(self, 'Something magical goes here')
        #some more magic happens in this class
    
    also_not_a_file = Magic(not_a_file)
    fp = open(also_not_a_file,'r')
    print(fp.readlines()) # 'there is a lot of blah blah in this so-called file'
    

4 个答案:

答案 0 :(得分:5)

StringIO返回一个StringIO对象,它几乎等同于open语句返回的文件对象。基本上,您可以使用StringIO代替open语句。

# from io import StringIO for python 3
from StringIO import StringIO
with StringIO('there is a lot of blah blah in this so-called file') as f:
    print(f.read())

输出:

there is a lot of blah blah in this so-called file

答案 1 :(得分:3)

您可以创建一个临时文件并将其名称传递给open:

在Unix上:

tp = tempfile.NamedTemporaryFile()
tp.write(b'there is a lot of blah blah blah in this so-called file')
tp.flush()
open(tp.name, 'r')

在Windows上,您需要关闭临时文件才能打开它:

tp = tempfile.NamedTemporaryFile(delete=False)
tp.write(b'there is a lot of blah blah blah in this so-called file')
tp.close()
open(tp.name, 'r')

一旦您使用该文件,您就有责任删除该文件。

答案 2 :(得分:2)

根据您的评论和最近编辑我可以告诉您,您需要一个可以使用open语句打开的文件。 (我将留下我的另一个答案,因为这是对这类问题更正确的方法)

可以使用tempfile来解决你的问题,它基本上是这样做的:创建你的文件,对你的文件做一些事情,然后在关闭时删除你的文件。

import os
from tempfile import NamedTemporaryFile

f = NamedTemporaryFile(mode='w+', delete=False)
f.write("there is a lot of blah blah in this so-called file")
f.close()
with open(f.name, "r") as new_f:
    print(new_f.read())

os.unlink(f.name) # delete the file after

答案 3 :(得分:0)

其他答案对我不起作用,但我设法弄清楚了。

使用Python 3时,您需要使用io package

    import io
    with io.StringIO("some initial text data") as f:
        # now you can do things with f as if it was an opened file.
        function_that_requires_a_Fileobject_as_argument(f)