如何在Python 3中获取字符串的第n行?比如说:
getline("line1\nline2\nline3",3)
是否有使用stdlib / builtin函数的方法来实现此功能? 我更喜欢用Python 3解决方案,但Python 2也可以。
如何在Python 3中获取字符串的第n行?比如说:
getline("line1\nline2\nline3",3)
是否有使用stdlib / builtin函数的方法来实现此功能? 我更喜欢用Python 3解决方案,但Python 2也可以。
尝试以下内容:
s = "line1\nline2\nline3"
print s.splitlines()[2]
`my_string.strip().split("\n")[-1]`
>>> import StringIO
>>> from itertools import islice
>>> s = "line1\nline2\nline3"
>>> gen = StringIO.StringIO(s)
>>> print next(islice(gen, 2, 3))
line3
从评论中看来,这个字符串非常大。如果数据太多而无法舒适地放入内存中,一种方法是使用以下方法逐行处理文件中的数据:
N = ...
with open('data.txt') as inf:
for count, line in enumerate(inf, 1):
if count == N: #search for the N'th line
print line
with
的优点是当您完成或遇到异常时,它会自动为您关闭文件。with io.StringIO(data) as inf:
- Joel Cornett使用字符串缓冲区:
import io
def getLine(data, line_no):
buffer = io.StringIO(data)
for i in range(line_no - 1):
try:
next(buffer)
except StopIteration:
return '' #Reached EOF
try:
return next(buffer)
except StopIteration:
return '' #Reached EOF
next(buffer)
而不是 buffer.next()
,并且使用 io.StringIO
而不是 StringIO.StringIO
。 - slothdef getLine(data, line_no):
n = 0
lastPos = -1
for i in range(0, len(data) - 1):
if data[i] == "\n":
n = n + 1
if n == line_no:
return data[lastPos + 1:i]
else:
lastPos = i;
if(n == line_no - 1):
return data[lastPos + 1:]
return "" # end of string
既然您提到了内存效率这一点,那么这个方案是否更好呢:
s = "line1\nline2\nline3"
# number of the line you want
line_number = 2
i = 0
line = ''
for c in s:
if i > line_number:
break
else:
if i == line_number-1 and c != '\n':
line += c
elif c == '\n':
i += 1
为了提高可读性,将其拆分成两个函数
string = "foo\nbar\nbaz\nfubar\nsnafu\n"
def iterlines(string):
word = ""
for letter in string:
if letter == '\n':
yield word
word = ""
continue
word += letter
def getline(string, line_number):
for index, word in enumerate(iterlines(string),1):
if index == line_number:
#print(word)
return word
print(getline(string, 4))
我的解决方案(高效且紧凑):
def getLine(data, line_no):
index = -1
for _ in range(line_no):index = data.index('\n',index+1)
return data[index+1:data.index('\n',index+1)]
splitlines
或者字符串很大。请编辑你的问题,让这一点清晰明了,然后我会删除这个回答。 - Mark Longair