StringIO с бинарными файлами? - PullRequest
       11

StringIO с бинарными файлами?

5 голосов
/ 26 сентября 2011

Кажется, я получаю разные результаты:

from StringIO import *

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

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

Почему?Это потому, что StringIO поддерживает только текстовые строки или что-то в этом роде?

Ответы [ 3 ]

8 голосов
/ 26 сентября 2011

Когда вы вызываете 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')

5 голосов
/ 26 сентября 2011

Второй file.read() фактически возвращает просто пустую строку.Вы должны сделать file.seek(0), чтобы перемотать смещение внутреннего файла.

0 голосов
/ 26 сентября 2011

Разве вы не должны использовать "rb" для открытия вместо просто "r", поскольку этот режим предполагает, что вы будете обрабатывать только символы ASCII и EOFs?

...