Wie kann ich eine Zeichenfolge in eine Datei in Python einschließen?

82

Wie erstelle ich ein dateiähnliches Objekt (der gleiche Ententyp wie Datei) mit dem Inhalt einer Zeichenfolge?

Daryl Spitzer
quelle

Antworten:

117

Verwenden Sie für Python 2.x das StringIO- Modul. Beispielsweise:

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

Ich verwende cStringIO (was schneller ist), aber beachte, dass es keine Unicode-Zeichenfolgen akzeptiert, die nicht als einfache ASCII-Zeichenfolgen codiert werden können . (Sie können zu StringIO wechseln, indem Sie "von cStringIO" in "von StringIO" ändern.)

Verwenden Sie für Python 3.x das ioModul.

f = io.StringIO('foo')
Daryl Spitzer
quelle
1
Es gibt jetzt einen Grund, cStringIO zu verwenden: cStringIO unterstützt keine Unicode-Zeichenfolgen.
Armin Ronacher
6
Ich denke, eine bessere Idee ist es, 'cStringIO als StringIO zu importieren'. Auf diese Weise müssen Sie nur eine Zeile ändern, wenn Sie aus irgendeinem Grund zur reinen Python-Implementierung wechseln müssen.
John Fouhy
Dies funktioniert auch für Python2.7: io.StringIO(u'foo')Ich würde dies verwenden
guettli
29

In Python 3.0:

import io

with io.StringIO() as f:
    f.write('abcdef')
    print('gh', file=f)
    f.seek(0)
    print(f.read())
jfs
quelle
1
@ABB Die akzeptierte Antwort zeigt eine solche Verwendung bereits. Meine Antwort ist komplementär: Sie demonstriert with-Statement- und Schreib-, Druck-, Such- und Lesemethoden.
JFS
6

Dies funktioniert für Python2.7 und Python3.x:

io.StringIO(u'foo')
guettli
quelle
5

Wenn erwartet wird, dass Ihr dateiähnliches Objekt Bytes enthält, sollte die Zeichenfolge zuerst als Bytes codiert werden, und dann kann stattdessen ein BytesIO- Objekt verwendet werden. In 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')))
Lensonp
quelle