ฉันจะรวมสตริงในไฟล์ใน Python ได้อย่างไร


คำตอบ:


124

สำหรับ Python 2.x ให้ใช้โมดูลStringIO ตัวอย่างเช่น:

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

ฉันใช้ cStringIO (ซึ่งเร็วกว่า) แต่โปรดทราบว่ามันไม่ยอมรับสตริง Unicode ที่ไม่สามารถเข้ารหัสเป็นสตริง ASCII ธรรมดาได้ (คุณสามารถเปลี่ยนเป็น StringIO ได้โดยเปลี่ยน "จาก cStringIO" เป็น "จาก StringIO")

สำหรับ Python 3.x ให้ใช้ioโมดูล

f = io.StringIO('foo')

1
มีเหตุผลที่ต้องใช้ cStringIO: cStringIO ไม่รองรับสตริงยูนิโคด
Armin Ronacher

6
ฉันคิดว่าแนวคิดที่ดีกว่าคือการทำ 'นำเข้า cStringIO เป็น StringIO' ด้วยวิธีนี้หากคุณต้องการเปลี่ยนไปใช้การใช้งาน python บริสุทธิ์ไม่ว่าด้วยเหตุผลใดก็ตามคุณต้องเปลี่ยนเพียงบรรทัดเดียว ..
John Fouhy

สิ่งนี้ใช้ได้กับ Python2.7 เช่นกัน: io.StringIO(u'foo')ฉันจะใช้สิ่งนี้
guettli

29

ใน 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 คำตอบที่ยอมรับแสดงการใช้งานดังกล่าวแล้ว คำตอบของฉันเป็นส่วนเสริม: มันแสดงให้เห็น - การแสดง withและการเขียนพิมพ์ค้นหาวิธีการอ่าน
jfs


5

หากคาดว่าวัตถุคล้ายไฟล์ของคุณมีไบต์สตริงควรเข้ารหัสเป็นไบต์ก่อนจากนั้นจึงสามารถใช้อ็อบเจ็กต์BytesIOแทนได้ ใน 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')))

2

สองคำตอบที่ดี ฉันจะเพิ่มเคล็ดลับเล็กน้อย - หากคุณต้องการอ็อบเจ็กต์ไฟล์จริง (บางวิธีคาดหวังอย่างใดอย่างหนึ่งไม่ใช่แค่อินเทอร์เฟซ) นี่คือวิธีสร้างอะแดปเตอร์:



2
ดูเหมือนว่าจะกลับมาแล้ว (7 ปีต่อมา;)
Ethan Furman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.