2016-11-11 2 views
1

Я хочу перебирать строки cStringIO, но, похоже, он не работает с циклом foreach. Точнее, поведение похоже на то, что коллекция пуста. Что я делаю не так?Python с использованием 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 
... 
>>> 

Спасибо.

ответ

2

cStringIO.StringIO возвращает либо cStringIO.InputType объект т.е. входной поток, если предусмотрен string 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 («\ п»)' просто потому, что читаемости и делает ваш код более вещим –

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 
Смежные вопросы