StringIO与二进制文件?

时间:2011-09-26 16:27:27

标签: python string file stringio

我似乎得到了不同的输出:

from StringIO import *

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

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

为什么呢?是因为StringIO只支持文本字符串吗?

3 个答案:

答案 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')

答案 1 :(得分:5)

第二个file.read()实际上只返回一个空字符串。您应该file.seek(0)来回退内部文件偏移量。

答案 2 :(得分:-1)

您不应该使用"rb"来打开,而不仅仅是"r",因为此模式假定您只处理ASCII字符和EOF吗?