2016-11-11 6 views
1

foreachループでは動作しないようですが、cStringIOオブジェクトを繰り返し処理したいと思います。より正確には、コレクションが空であるかのように動作します。私は間違って何をしていますか?foreachループでcStringIOを使用するPython

例:

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 
... 
>>> 

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

答えて

2

cStringIO.StringIOリターンのいずれかcStringIO.InputTypeオブジェクト入力ストリームすなわち提供されている場合文字列elseまたは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) 
1

文字列split方法を試してみてください:あなたは、常に新しい行に分割されている場合、

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

または提案などを:

for line in s.getvalue().splitlines(): print line 
+1

ではなく、理由だけで可読性のstr.split(「\ n」)で '' 'よりstr.splitlinesを()'使用し、あなたのコードをよりニシキヘビ作ることを好みます –

0

あなたは書き込み後に開いているファイルハンドルから内容を読み取ることはできますが、最初に戻って先頭にポインタを移動するseek(0)メソッドを使用する必要があります。これは、cStringIOまたは実際のファイルのいずれかのために動作します:

import cStringIO 
s = cStringIO.StringIO() 
s.write("Hello\nWorld\n") # Python automatically converts '\n' as needed 
s.getvalue() 
# 'Hello\nWorld\n' 
s.seek(0) # move pointer to start of file 
for line in s : 
    print line.strip() 
# Hello 
# World 
関連する問題