StringIO可以用于二进制文件吗?

5 投票
3 回答
11697 浏览
提问于 2025-04-17 03:07

我发现我得到的输出结果不一样:

from StringIO import *

file = open('1.bmp', 'r')

print file.read(), '\n'
print StringIO(file.read()).getvalue()

这是为什么呢?是不是因为StringIO只支持文本字符串之类的原因?

3 个回答

-1

你是不是应该用 "rb" 来打开文件,而不是仅仅用 "r" 呢?因为 "r" 模式假设你只会处理 ASCII 字符和文件结束符(EOF)。

5

第二次使用 file.read() 时,实际上返回的只是一个空字符串。你应该先用 file.seek(0) 来把文件的读取位置重新调整到开头。

8

当你调用 file.read() 的时候,它会把整个文件的内容都读到内存里。然后,如果你再次对同一个文件对象调用 file.read(),因为已经读到文件的末尾了,所以它只会返回一个空字符串。

相反,你可以尝试重新打开文件,比如:

from StringIO import *

file = open('1.bmp', 'r')
print file.read(), '\n'
file.close()

file2 = open('1.bmp', 'r')
print StringIO(file2.read()).getvalue()
file2.close()

你也可以使用 with 语句来让代码看起来更简洁:

from StringIO import *

with open('1.bmp', 'r') as file:
    print file.read(), '\n'

with open('1.bmp', 'r') as file2:
    print StringIO(file2.read()).getvalue()

顺便说一下,我建议以二进制模式打开二进制文件: open('1.bmp', 'rb')

撰写回答