Python io – BytesIO、StringIO

Python io 模块允许我们管理与文件相关的输入和输出操作。使用 IO 模块的优点在于,可用的类和函数使我们能够扩展功能以实现对 Unicode 数据的写入。

Python IO 模块

有许多种方法可以使用 io 模块在 Python 中执行流和缓冲区操作。我们将在这里演示很多示例来证明这一点。让我们开始吧。

Python BytesIO

就像我们使用变量一样,当我们使用 io 模块的字节 IO 操作时,数据可以保留为字节在内存缓冲区中。以下是一个演示此操作的示例程序:

import io

stream_str = io.BytesIO(b"JournalDev Python: \x00\x01")
print(stream_str.getvalue())

让我们看看此程序的输出: getvalue() 函数只是从缓冲区中获取值作为字符串。

Python StringIO

我们甚至也可以使用 StringIO,它在使用上与 BytesIO 非常相似。以下是一个示例程序:

import io

data = io.StringIO()
data.write('JournalDev: ')
print('Python.', file=data)

print(data.getvalue())

data.close()

讓我們看看這個程式的輸出:請注意,即使在完成緩衝區後,我們也會關閉緩衝區。這有助於節省緩衝區記憶體,因為它們將數據存儲在內存中。同時,我們還使用了print方法,並使用可選參數來指定變數的IO流,這與打印語句完全兼容。

使用StringIO進行讀取

一旦我們將一些數據寫入StringIO緩衝區,我們也可以進行讀取。讓我們看一段代碼片段:

import io

input = io.StringIO('This goes into the read buffer.')
print(input.read())

讓我們看看這個程式的輸出:

使用StringIO讀取文件

也可以讀取文件並將其作為字節流在網絡上傳輸。可以使用io模塊將媒體文件(如圖像)轉換為字節。以下是一個示例程式:

import io

file = io.open("whale.png", "rb", buffering = 0)
print(file.read())

讓我們看看這個程式的輸出:為了使此程式運行,我們的當前目錄中需要有一個名為whale.png的圖像。

io.open() vs os.open()

io.open() 函数是执行 I/O 操作的首选方式,因为它被设计为高级接口来执行文件 I/O。它将操作系统级的文件描述符包装在一个对象中,我们可以以 Pythonic 的方式访问该文件。 os.open() 函数负责处理较低级别的 POSIX 系统调用。它接受基于 POSIX 的输入参数,并返回代表已打开文件的文件描述符。它不返回文件对象;返回的值不具有 read()write() 函数。总体而言,io.open() 函数只是对 os.open() 函数的包装器。 os.open() 函数还会设置默认配置,如标志和模式,而 io.open() 则不会,它取决于传递给它的值。

结论

在這堂課中,我們學習了Python IO模塊的簡單操作,以及如何使用BytesIO來管理Unicode字符。然而,如果你正在尋找完整的文件操作,比如刪除和複製文件,請閱讀python讀取文件。參考:API文檔

Source:
https://www.digitalocean.com/community/tutorials/python-io-bytesio-stringio