1

行 cStringIO オブジェクトを反復処理したいのですが、foreach ループでは機能しないようです。より正確に言うと、コレクションが空であるかのように振る舞います。私は何を間違っていますか?

例:

Python 2.7.12 (default, Aug 29 2016, 16:51:45)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cStringIO
>>> s = cStringIO.StringIO()
>>> import os
>>> s.write("Hello" + os.linesep + "World" + os.linesep)
>>> s.getvalue()
'Hello\nWorld\n'
>>> for line in s :
...     print line
...
>>>

ありがとうございました。

4

3 に答える 3

2

cStringIO.StringIOcStringIO.InputTypeオブジェクト、つまり文字列が指定されている場合は入力ストリーム、またはオブジェクト、つまり出力ストリームのいずれかを返しますcStringIO.OutputType

In [13]: sio = cStringIO.StringIO()

In [14]: sio??
Type:        StringO
String form: <cStringIO.StringO object at 0x7f63d418f538>
Docstring:   Simple type for output to strings.

In [15]: isinstance(sio, cStringIO.OutputType)
Out[15]: True

In [16]: sio = cStringIO.StringIO("dsaknml")

In [17]: sio??
Type:        StringI
String form: <cStringIO.StringI object at 0x7f63d4218580>
Docstring:   Simple type for treating strings as input file streams

In [18]: isinstance(sio, cStringIO.InputType)
Out[18]: True

したがって、読み取り操作または書き込み操作のいずれかを実行できますが、両方を実行することはできません。cStringIO.OutputType オブジェクトで読み取り操作を行う簡単な解決策は、getvalue() メソッドで値に変換することです。

両方の操作を実行しようとすると、どちらかが黙って無視されます。

cStringIO.OutputType.getvalue(c_string_io_object)
于 2016-11-11T17:39:57.873 に答える
1

文字列splitメソッドを使用してみてください:

for line in s.getvalue().split('\n'): print line
...
Hello
World

または、提案されているように、常に新しい行で分割している場合:

for line in s.getvalue().splitlines(): print line
于 2016-11-11T15:56:37.637 に答える