Làm cách nào để bọc một chuỗi trong một tệp bằng Python?


85

Làm cách nào để tạo một đối tượng giống tệp (giống vịt với Tệp) với nội dung là một chuỗi?

Câu trả lời:


121

Đối với Python 2.x, hãy sử dụng mô-đun StringIO . Ví dụ:

>>> from cStringIO import StringIO
>>> f = StringIO('foo')
>>> f.read()
'foo'

Tôi sử dụng cStringIO (nhanh hơn), nhưng lưu ý rằng nó không chấp nhận các chuỗi Unicode không thể được mã hóa thành chuỗi ASCII thuần túy . (Bạn có thể chuyển sang StringIO bằng cách thay đổi "từ cStringIO" thành "từ StringIO".)

Đối với Python 3.x, hãy sử dụng iomô-đun.

f = io.StringIO('foo')

1
Bây giờ có lý do để sử dụng cStringIO: cStringIO không hỗ trợ chuỗi unicode.
Armin Ronacher

6
Tôi nghĩ một ý tưởng tốt hơn là thực hiện 'nhập cStringIO dưới dạng StringIO'. Bằng cách đó nếu bạn cần phải chuyển sang thực hiện trăn tinh khiết vì lý do nào đó, bạn chỉ cần thay đổi một dòng ..
John Fouhy

Điều này cũng hoạt động cho Python2.7: io.StringIO(u'foo')Tôi sẽ sử dụng cái này
guettli 27/02

29

Trong Python 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())

1
@ABB câu trả lời được chấp nhận cho thấy cách sử dụng như vậy đã có. Câu trả lời của tôi là bổ sung: nó thể hiện with-statement và các phương thức write, print, seek, read.
jfs

6

Điều này hoạt động cho Python2.7 và Python3.x:

io.StringIO(u'foo')

5

Nếu đối tượng giống tệp của bạn dự kiến ​​chứa byte, thì chuỗi trước tiên phải được mã hóa dưới dạng byte, sau đó có thể sử dụng đối tượng BytesIO để thay thế. Trong Python 3:

from io import BytesIO

string_repr_of_file = 'header\n byline\n body\n body\n end'
function_that_expects_bytes(BytesIO(bytes(string_repr_of_file,encoding='utf-8')))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.