如何使用 io 在内存中生成数据流作为文件之类的对象?
How to use io to generate in memory data streams as file like objects?
我喜欢在 Python 中生成内存中(临时文件)数据流。一个线程用数据填充流,另一个线程使用数据。
查看io - Core tools for working with streams 后,我觉得io
模块是最好的选择。
所以我举个简单的例子给我:
#!/usr/local/bin/python3
# encoding: utf-8
import io
if __name__ == '__main__':
a = io.BytesIO()
a.write("hello".encode())
txt = a.read(100)
txt = txt.decode("utf-8")
print(txt)
我的例子不起作用。 "hello"
没有写入a,之后无法读取。那是我的错误吗?我必须如何更改我的代码才能在内存中获取类似对象的文件?
其实是这么写的;但阅读是个问题。您应该指的是 class io.BytesIO。您可以使用 getvalue()
获取该值。喜欢,
import io
a = io.BytesIO()
a.write("hello".encode())
txt = a.getvalue()
txt = txt.decode("utf-8")
print(txt)
@dhilmathy 和@ShadowRanger 提到 io.BytesIO()
没有单独的读写指针。
我通过创建一个实现读指针并记住写入字节数的简单 class 来解决这个问题。当读取的字节数等于写入的字节数时,文件将缩小以节省内存。
目前我的解决方案:
#!/usr/local/bin/python3
# encoding: utf-8
import io
class memoryStreamIO(io.BytesIO):
"""
memoryStreamIO
a in memory file like stream object
"""
def __init__(self):
super().__init__()
self._wIndex = 0
self._rIndex = 0
self._mutex = threading.Lock()
def write(self, d : bytearray):
self._mutex.acquire()
r = super().write(d)
self._wIndex += len(d)
self._mutex.release()
return r
def read(self, n : int):
self._mutex.acquire()
super().seek(self._rIndex)
r = super().read(n)
self._rIndex += len(r)
# now we are checking if we can
if self._rIndex == self._wIndex:
super().truncate(0)
super().seek(0)
self._rIndex = 0
self._wIndex = 0
self._mutex.release()
return r
def seek(self, n):
self._mutex.acquire()
self._rIndex = n
r = super().seek(n)
self._mutex.release()
return r
if __name__ == '__main__':
a = streamIO()
a.write("hello".encode())
txt = (a.read(100)).decode()
print(txt)
a.write("abc".encode())
txt = (a.read(100)).decode()
print(txt)
我喜欢在 Python 中生成内存中(临时文件)数据流。一个线程用数据填充流,另一个线程使用数据。
查看io - Core tools for working with streams 后,我觉得io
模块是最好的选择。
所以我举个简单的例子给我:
#!/usr/local/bin/python3
# encoding: utf-8
import io
if __name__ == '__main__':
a = io.BytesIO()
a.write("hello".encode())
txt = a.read(100)
txt = txt.decode("utf-8")
print(txt)
我的例子不起作用。 "hello"
没有写入a,之后无法读取。那是我的错误吗?我必须如何更改我的代码才能在内存中获取类似对象的文件?
其实是这么写的;但阅读是个问题。您应该指的是 class io.BytesIO。您可以使用 getvalue()
获取该值。喜欢,
import io
a = io.BytesIO()
a.write("hello".encode())
txt = a.getvalue()
txt = txt.decode("utf-8")
print(txt)
@dhilmathy 和@ShadowRanger 提到 io.BytesIO()
没有单独的读写指针。
我通过创建一个实现读指针并记住写入字节数的简单 class 来解决这个问题。当读取的字节数等于写入的字节数时,文件将缩小以节省内存。
目前我的解决方案:
#!/usr/local/bin/python3
# encoding: utf-8
import io
class memoryStreamIO(io.BytesIO):
"""
memoryStreamIO
a in memory file like stream object
"""
def __init__(self):
super().__init__()
self._wIndex = 0
self._rIndex = 0
self._mutex = threading.Lock()
def write(self, d : bytearray):
self._mutex.acquire()
r = super().write(d)
self._wIndex += len(d)
self._mutex.release()
return r
def read(self, n : int):
self._mutex.acquire()
super().seek(self._rIndex)
r = super().read(n)
self._rIndex += len(r)
# now we are checking if we can
if self._rIndex == self._wIndex:
super().truncate(0)
super().seek(0)
self._rIndex = 0
self._wIndex = 0
self._mutex.release()
return r
def seek(self, n):
self._mutex.acquire()
self._rIndex = n
r = super().seek(n)
self._mutex.release()
return r
if __name__ == '__main__':
a = streamIO()
a.write("hello".encode())
txt = (a.read(100)).decode()
print(txt)
a.write("abc".encode())
txt = (a.read(100)).decode()
print(txt)