2012-04-22 31 views
53

Sử dụng phiên bản Python2.7. Dưới đây là mã mẫu của tôi.Không nhận dữ liệu bằng cách sử dụng read() của StringIO trong python

import StringIO 
import sys 

buff = StringIO.StringIO() 
buff.write("hello") 
print buff.read() 

trong chương trình trên, đọc() trả về tôi không có gì khi getvalue() trả lại cho tôi "xin chào". Bất cứ ai có thể giúp tôi trong việc sửa chữa vấn đề? Tôi cần đọc() vì mã sau của tôi liên quan đến việc đọc các byte "n".

+0

không có chức năng đọc tên '()' trong [StringIO] (http://docs.python.org/library/stringio.html#module-StringIO) – hjpotter92

+0

@ ChasingDeath: Đúng vậy. Hãy thử 'dir (StringIO.StringIO)'. –

+2

yeah StringIO tạo một tệp như đối tượng cho các chuỗi vì vậy tất nhiên sẽ có 'read()' – jamylak

Trả lời

77

Bạn cần đặt lại vị trí bộ đệm về đầu. Bạn có thể làm điều này bằng cách thực hiện buff.seek(0).

Mỗi khi bạn đọc hoặc ghi vào bộ đệm, vị trí được nâng cao lên một bộ đệm. Giả sử bạn bắt đầu với bộ đệm trống.

Giá trị bộ đệm là "", vị trí bộ đệm là 0. Bạn làm buff.write("hello"). Rõ ràng giá trị bộ đệm hiện là hello. Tuy nhiên, vị trí bộ đệm bây giờ là 5. Khi bạn gọi read(), không có vị trí nào trong quá khứ 5 để đọc! Vì vậy, nó trả về một chuỗi rỗng.

11
In [38]: out_2 = StringIO.StringIO('not use write') # be initialized to an existing string by passing the string to the constructor 

In [39]: out_2.getvalue() 
Out[39]: 'not use write' 

In [40]: out_2.read() 
Out[40]: 'not use write' 

hoặc

In [5]: out = StringIO.StringIO() 

In [6]: out.write('use write') 

In [8]: out.seek(0) 

In [9]: out.read() 
Out[9]: 'use write' 
+0

out.seek (0) là những gì còn thiếu đối với tôi khi tôi đang cố gắng đổ một đĩa dưa vào StringIO và tải lên s3. Một khi tôi bị đẩy lùi về đầu, đối tượng s3 của tôi sẽ được phổ biến đúng cách. – Matthew

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