Python中StringIO和BytesIO用法及區(qū)別
在 Python 中,我們平時處理的輸入輸出(I/O)大多數(shù)是針對文件或網(wǎng)絡(luò)數(shù)據(jù)的,但有時候,我們希望直接在內(nèi)存中進(jìn)行讀寫,而不必先把數(shù)據(jù)存到硬盤上。
這時候,StringIO 和 BytesIO 就派上用場了。
簡單理解:
- StringIO → 操作內(nèi)存中的 字符串(
str類型) - BytesIO → 操作內(nèi)存中的 二進(jìn)制數(shù)據(jù)(
bytes類型)
它們都來自 io 模塊,接口和文件對象幾乎一模一樣,所以學(xué)會文件操作就能直接用它們。
1. 為什么要用 StringIO / BytesIO
- 無需磁盤 I/O,速度快
- 便于測試(不需要真實(shí)文件)
- 在網(wǎng)絡(luò)編程中常用(比如 HTTP 響應(yīng)先存在內(nèi)存中再處理)
- 數(shù)據(jù)臨時存儲(比如生成報(bào)告、圖片)
2. StringIO 基礎(chǔ)用法
StringIO 適合處理 文本數(shù)據(jù),使用方式類似普通文件:
from io import StringIO
# 創(chuàng)建 StringIO 對象
f = StringIO()
# 寫入數(shù)據(jù)
f.write("Hello ")
f.write("Python")
# 獲取當(dāng)前內(nèi)容
print(f.getvalue()) # Hello Python
注意:getvalue() 用來獲取緩沖區(qū)的全部數(shù)據(jù)。
3. StringIO 讀取數(shù)據(jù)
我們也可以直接用 StringIO 來模擬讀取文件:
from io import StringIO
data = "Line1\nLine2\nLine3"
f = StringIO(data)
# 一次性讀取
print(f.read())
# 重置游標(biāo)
f.seek(0)
# 按行讀取
for line in f:
print(line.strip())
要點(diǎn):
seek(0)→ 把“文件指針”移動到開頭- 讀取方法(
read、readline、readlines)和文件對象一致
4. BytesIO 基礎(chǔ)用法
BytesIO 用于處理 二進(jìn)制數(shù)據(jù),比如圖片、音頻、壓縮包等。
from io import BytesIO # 創(chuàng)建 BytesIO f = BytesIO() # 寫入二進(jìn)制數(shù)據(jù) f.write(b"Hello World") # 獲取數(shù)據(jù) print(f.getvalue()) # b'Hello World'
5. BytesIO 讀取數(shù)據(jù)
from io import BytesIO data = b"Binary\x00Data" f = BytesIO(data) # 讀取前6個字節(jié) print(f.read(6)) # b'Binary' # 繼續(xù)讀剩下的 print(f.read()) # b'\x00Data'
6. StringIO vs BytesIO 區(qū)別
| 特性 | StringIO | BytesIO |
|---|---|---|
| 處理數(shù)據(jù)類型 | str(文本) | bytes(二進(jìn)制) |
| 讀取寫入方式 | 和文本文件一致 | 和二進(jìn)制文件一致 |
| 編碼解碼 | 不需要手動編碼 | 需要自己 .encode() / .decode() |
| 常見應(yīng)用 | 日志處理、臨時文本 | 圖片、音頻、網(wǎng)絡(luò)傳輸數(shù)據(jù) |
7. 從文件到內(nèi)存的轉(zhuǎn)換
有時我們需要把磁盤文件內(nèi)容讀到內(nèi)存中用 BytesIO 處理,比如處理圖片:
from io import BytesIO
# 假設(shè)有個圖片
with open("test.png", "rb") as f:
data = f.read()
# 存入 BytesIO
bio = BytesIO(data)
# 讀取前10個字節(jié)
print(bio.read(10))
8. 從內(nèi)存保存到文件
反過來,我們也可以把 BytesIO 或 StringIO 的數(shù)據(jù)寫到磁盤:
from io import BytesIO
# 創(chuàng)建內(nèi)存數(shù)據(jù)
bio = BytesIO()
bio.write(b"Save me to file")
# 寫入文件
with open("output.bin", "wb") as f:
f.write(bio.getvalue())
9. 常見使用場景
- 臨時構(gòu)建數(shù)據(jù),避免磁盤 I/O
- 測試代碼時,模擬文件對象
- 網(wǎng)絡(luò)數(shù)據(jù)處理(HTTP 請求、Socket 傳輸)
- 圖片或音頻處理(配合 Pillow、pydub 等庫)
10. 最佳實(shí)踐
- 如果處理的是文本,用
StringIO,并且直接寫str類型。 - 如果處理的是二進(jìn)制數(shù)據(jù)(比如圖片、壓縮包),用
BytesIO,并且確保寫入的是bytes。 - 操作完成后不一定非要
close()(因?yàn)樗鼈兪莾?nèi)存對象),但為了習(xí)慣最好加上。 - 需要頻繁讀取時,記得用
seek(0)重置指針。
到此這篇關(guān)于Python中StringIO和BytesIO用法及區(qū)別的文章就介紹到這了,更多相關(guān)Python StringIO BytesIO內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
requests在python中發(fā)送請求的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于requests在python中發(fā)送請求的實(shí)例講解內(nèi)容,有興趣的朋友們可以測試學(xué)習(xí)下。2021-02-02
Python基于PyQt5開發(fā)一個SSH遠(yuǎn)程登錄終端工具
這篇文章主要為大家詳細(xì)介紹了Python如何基于PyQt5和Paramiko開發(fā)一個SSH遠(yuǎn)程登錄終端工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-03-03
python游戲開發(fā)之視頻轉(zhuǎn)彩色字符動畫
這篇文章主要為大家詳細(xì)介紹了python游戲開發(fā)之視頻轉(zhuǎn)彩色字符動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
Python必備基礎(chǔ)之閉包和裝飾器知識總結(jié)
都2021年了Python的閉包和裝飾器難道你還不會?今天就帶大家詳細(xì)總結(jié)一下Python閉包和裝飾器的相關(guān)知識,需要的朋友可以參考下2021-06-06
基于Python實(shí)現(xiàn)簡單的人臉識別系統(tǒng)
這篇文章主要介紹了如何通過Python實(shí)現(xiàn)一個簡單的人臉識別系統(tǒng),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以跟隨小編一起試一試2022-01-01

