来自字符串的Python readline()?

Bri*_*and 31 python

在python中,是否有内置的方法在字符串上执行readline()?我有大量的数据,并且想要剥离第一对没有在整个字符串上执行split()的几行.

假设的例子:

def handleMessage(msg):
   headerTo  = msg.readline()
   headerFrom= msg.readline()
   sendMessage(headerTo,headerFrom,msg)

msg = "Bob Smith\nJane Doe\nJane,\nPlease order more widgets\nThanks,\nBob\n"
handleMessage(msg)
Run Code Online (Sandbox Code Playgroud)

我希望这导致: sendMessage("Bob Smith", "Jane Doe", "Jane,\nPlease order...")

我知道编写一个这样做的类会很容易,但是如果可能的话,我正在寻找内置的东西.

编辑:Python v2.7

jte*_*ace 69

Python 2

您可以使用StringIO:

>>> msg = "Bob Smith\nJane Doe\nJane,\nPlease order more widgets\nThanks,\nBob\n"
>>> msg
'Bob Smith\nJane Doe\nJane,\nPlease order more widgets\nThanks,\nBob\n'
>>> import StringIO
>>> buf = StringIO.StringIO(msg)
>>> buf.readline()
'Bob Smith\n'
>>> buf.readline()
'Jane Doe\n'
Run Code Online (Sandbox Code Playgroud)

如果性能很重要,请务必使用cStringIO.

Python 3

你可以使用io.StringIO:

>>> import io
>>> buf = io.StringIO(msg)
>>> buf.readline()
'Bob Smith\n'
>>> buf.readline()
'Jane Doe\n'
>>> len(buf.read())
44
Run Code Online (Sandbox Code Playgroud)

  • 刚刚发现`io.StringIO`是使用Python 3.3的类 (2认同)

Amb*_*ber 22

为什么不只是根据需要进行多次分割呢?由于您正在使用所有生成的部分(包括字符串的其余部分),将其加载到其他缓冲区对象然后再次将其读回可能会更慢,而不是更快(加上函数调用的开销) .

如果你想把第一N行分开,那就行了.split("\n", N).

>>> foo = "ABC\nDEF\nGHI\nJKL"
>>> foo.split("\n", 1)
['ABC', 'DEF\nGHI\nJKL']
>>> foo.split("\n", 2)
['ABC', 'DEF', 'GHI\nJKL']
Run Code Online (Sandbox Code Playgroud)

所以对你的功能:

def handleMessage(msg):
   headerTo, headerFrom, msg = msg.split("\n", 2)
   sendMessage(headerTo,headerFrom,msg)
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想要得到幻想:

# either...
def handleMessage(msg):
   sendMessage(*msg.split("\n", 2))

# or just...
handleMessage = lambda msg: sendMessage(*msg.split("\n", 2))
Run Code Online (Sandbox Code Playgroud)


小智 13

python 2和3最简单的方法是使用string的方法splitlines().这将返回一个行列表.

>>> "some\nmultilene\nstring\n".splitlines()
Run Code Online (Sandbox Code Playgroud)

['some','multilene','string']

  • 而且str.splitlines()是跨平台的,无论行尾的样式是\ r \ n还是\ n。 (2认同)
  • 我认为这比接受的答案更方便。 (2认同)

Gla*_*los 5

像StringIO那样做:

i = self.buf.find('\n', self.pos)
Run Code Online (Sandbox Code Playgroud)

所以这意味着:

pos = msg.find("\n")
first_line = msg[:pos]
...
Run Code Online (Sandbox Code Playgroud)

看起来比使用整个StringIO更优雅......