【问题标题】:Save virtual and non-physical files保存虚拟和非物理文件
【发布时间】:2018-08-09 16:49:45
【问题描述】:

使用 base64 可以将文件转换为字符串,然后将字符串转换回新图像:

import base64
with open("first_image.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())

fh = open("second_image.png", "wb")
fh.write(base64.b64decode(str))
fh.close()

但是,使用上面编写的脚本,会创建图像的物理“副本”。相反,我需要将三个图像(已转换为字符串)保存为虚拟图像。这是因为这三个图像是在脚本加载过程中使用的,必须与其他图像分开。这样,如果脚本所需的文件(例如模块、图像等)丢失,这三个图像仍然存在。在这种情况下,三个图像是:“徽标”、“进度条”和“警告”。

那么,如何不将图像保存为物理文件,而是保存为可用作普通文件的虚拟文件?

编辑:

我环顾了一下,我设法为我的脚本创建了这个类:

ico_16 = here is the string for the image

pyglet.image.load(__temporary__(ico_16, "ico_16", ".png"))


class __temporary__():
    def __init__(self, str, px, sx):
        self.__ip__ = str
        self.__px__ = px
        self.__sx__ = sx
        self.__temp__()

    def __temp__(self):
        with tempfile.SpooledTemporaryFile(max_size=100000, mode="wb", prefix=self.__px__,
                                           suffix=self.__sx__) as __op__:
            __op__.write(base64.b64decode(self.__ip__))
            __op__.seek(0)
        return __op__

我正在使用 Pyglet,但我的问题对于最终使用的任何类型的模块都有效。例如,在 Pyglet 中,图像以以下方式打开:

file = open(filename, 'rb')

问题是我必须给它一个名字而不是一个文件,所以我不知道如何解决它。

事实上,当我尝试启动脚本时,我得到了错误:

Traceback (most recent call last):
  File "F:/Python/Project/PEDPD/main.py", line 153, in <module>
    window = PyEngine()
  File "F:/Python/Project/PEDPD/main.py", line 37, in __init__
    self.__icon_16__ = pyglet.image.load(__temporary__(ico_16, "ico_16", ".png"))
  File "F:\Python\Python34\lib\site-packages\pyglet\image\__init__.py", line 180, in load
    file = open(filename, 'rb')
TypeError: invalid file: <__main__.__temporary__ object at 0x00000000159D3128>

我试图打开 Tempfile 模块(因为该模块的指南并没有提供太多有用的信息,至少在我看来)。不幸的是,在我看来,我没有注意到任何可以帮助我的东西。

【问题讨论】:

  • 虚拟文件是什么意思?你想要一个内存中的 IO 句柄吗?
  • 在实践中,我希望将文件保存在计算机的虚拟内存中,而不是将文件保存在计算机的内存中。我不能很好地解释。在我看来,例如“StringIo”模块将字符串保存在虚拟内存中。我想做同样的事情,但使用三张图片。
  • 内存是 RAM。这就是我所说的拥有内存 IO 句柄的意思。您所说的内存通常称为存储/磁盘。你能说明你将如何使用这些手柄吗?
  • 什么意思?
  • 你只是想用它们来伪造二进制 IO 缓冲区,即好像来自 open("first_image.png", "rb") 的返回值。

标签: python python-3.x base64 temporary-files pyglet


【解决方案1】:

如果您想要一个内存中的二进制 IO 句柄,那么 io.BytesIO 就是您所寻求的。

In [1]: import io

In [2]: with io.BytesIO() as handle:
   ...:     handle.write(b'abc')
   ...:     handle.seek(0)
   ...:     print(next(handle))
   ...:     
b'abc'

你也可以用一些数据来初始化句柄,而不是调用writeseek

In [3]: handle = io.BytesIO(b'abc')

In [4]: next(handle)
Out[4]: b'abc'

【讨论】:

  • 这样做,但是,字符串仍然在我的记忆中,对吧?另一方面,我需要记住从字符串中获得的图像。我修改了这个问题,实际上是为了添加更多信息。
  • @BlackFenix06 是的,字符串保留在 RAM 中并且永远不会写入磁盘。不过,您可以自己将文件写入磁盘。
  • @BlackFenix06 如果你“需要记住从字符串中获取的图像”,他们为什么首先要求内存中的 IO 存储?跨度>
  • 我没有问,但我解释了我想要做什么。如果您误解或我误解了自己,我深表歉意。在实践中,我需要将三个图像保存在 RAM 上而不是 ROM 上。
  • 我请求原谅我的语法错误,但我正在使用谷歌翻译。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2011-03-10
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
相关资源
最近更新 更多