2011-09-26 40 views
5

tôi dường như để có được kết quả đầu ra khác nhau:StringIO với các tệp nhị phân?

from StringIO import * 

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

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

Tại sao? Có phải vì StringIO chỉ hỗ trợ chuỗi văn bản hay gì đó?

+2

với mã đó, tệp thứ hai.read() sẽ không nhận được gì. Bạn nên sử dụng tìm kiếm (0) trước khi đọc lại tệp. –

Trả lời

8

Khi bạn gọi file.read(), nó sẽ đọc toàn bộ tệp vào bộ nhớ. Sau đó, nếu bạn gọi lại file.read() trên cùng một đối tượng tệp, nó sẽ đến cuối tệp, vì vậy nó sẽ chỉ trả về một chuỗi rỗng.

Thay vào đó, hãy thử ví dụ: mở lại tập tin:

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() 

Bạn cũng có thể sử dụng câu lệnh with để làm cho rằng mã sạch hơn:

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() 

Là một sang một bên, tôi muốn giới thiệu mở tập tin nhị phân trong chế độ nhị phân: open('1.bmp', 'rb')

+0

Vâng, bạn nói đúng. Điều đó đã không hoàn toàn giải quyết vấn đề thế giới thực của tôi, sau đó tôi đã tìm ra tôi đã viết dữ liệu ở chế độ 'w' và nhận các tệp bị hỏng, không phải 'wb'. Bây giờ mọi thứ hoạt động :) – Joelmc

+0

Tôi nghĩ rằng file.seek (0), được đề xuất bởi minhee, là một cách tiếp cận tốt hơn nhiều. – Gallaecio

-1

Bạn không nên sử dụng "rb" để mở, thay vì chỉ "r", vì chế độ này giả định rằng bạn sẽ chỉ xử lý các ký tự ASCII và EOF?

+0

Trên một số nền tảng (và ở mọi nơi trên Python 3) chỉ 'r' có nghĩa là chế độ nhị phân. Ngoài ra, vui lòng không thêm dòng giới thiệu/chữ ký vào bài đăng của bạn. – agf

5

Thứ hai file.read() thực sự chỉ trả về một chuỗi trống. Bạn nên làm file.seek(0) để tua lại bù đắp tệp nội bộ.

Các vấn đề liên quan