2016-11-11 45 views
1

我想迭代行cStringIO对象,但它似乎不适用于foreach循环。更确切地说,行为就好像集合是空的。我究竟做错了什么?使用cStringIO与foreach循环的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.splitlines()'而不是'str.split(“\ n”)'只是因为可读性,使代码更Python:这将要么cStringIO或一个真正的文件工作 –

0

你可以写后读从一个打开的文件句柄的内容,但你首先要使用seek(0)方法将指针移动回到开始。

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