簡體   English   中英

Python readline() 來自字符串?

[英]Python readline() from a string?

在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)

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

我知道編寫一個這樣做的類會相當容易,但如果可能的話,我正在尋找內置的東西。

編輯:Python v2.7

在 Python 3 中,您可以使用io.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 io
>>> buf = io.StringIO(msg)
>>> buf.readline()
'Bob Smith\n'
>>> buf.readline()
'Jane Doe\n'
>>> len(buf.read())
44

在Python 2,你可以使用StringIO的(或cStringIO如果性能是很重要的):

>>> import StringIO
>>> buf = StringIO.StringIO(msg)
>>> buf.readline()
'Bob Smith\n'
>>> buf.readline()
'Jane Doe\n'

python 2 和 3 最簡單​​的方法是使用字符串的方法splitlines ()。 這將返回一個行列表。

>>> "some\nmultilene\nstring\n".splitlines()

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

為什么不只是根據需要進行盡可能多的拆分? 由於您正在使用所有結果部分(包括字符串的其余部分),將其加載到其他緩沖區對象中,然后再次讀取它可能會更慢,而不是更快(加上函數調用的開銷) .

如果您想將前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']

所以對於你的功能:

def handleMessage(msg):
   headerTo, headerFrom, msg = msg.split("\n", 2)
   sendMessage(headerTo,headerFrom,msg)

或者如果你真的想變得花哨:

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

# or just...
handleMessage = lambda msg: sendMessage(*msg.split("\n", 2))

像 StringIO 那樣做:

i = self.buf.find('\n', self.pos)

所以這意味着:

pos = msg.find("\n")
first_line = msg[:pos]
...

似乎比使用整個 StringIO 更優雅...

在 Python 字符串中有方法分割線

msg = "Bob Smith\nJane Doe\nJane,\nPlease order more widgets\nThanks,\nBob\n"
msg_splitlines = msg.splitlines()
headerTo = msg_splitlines[0]
headerFrom= msg_splitlines[1]
sendMessage(headerTo,headerFrom,msg)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM