получить n-ю строку строки в python

Как вы можете получить n-ю строку строки в Python 3? Например

getline("line1\nline2\nline3",3) 

Есть ли способ сделать это, используя stdlib / встроенные функции? Я предпочитаю решение в Python 3, но Python 2 тоже прекрасен.

7 Solutions collect form web for “получить n-ю строку строки в python”

Попробуйте следующее:

 s = "line1\nline2\nline3" print s.splitlines()[2] 

Используйте строковый буфер:

 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 

функциональный подход

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

Использование enumerate () дает вам индекс и значение объекта, который вы итерируете, и вы можете указать начальное значение, поэтому я использовал 1 (вместо значения по умолчанию 0)

Преимущество использования заключается в том, что он автоматически закрывает файл для вас, когда вы закончите, или если вы столкнулись с исключением.

Поскольку вы повысили эффективность использования памяти, это лучше:

 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 

Более эффективное решение, чем разбиение строки, состояло бы в том, чтобы перебирать ее символы, находить положения N-го и (N-1) -го появления «\ n» (с учетом граничного случая в начале строки) , N-я строка – это подстрока между этими позициями.

Вот фрагмент кода, демонстрирующий его (номер строки 1 проиндексирован):

 def 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 

Это также более эффективно, чем решение, которое строит строку по одному символу за раз.

Мое решение (эффективное и компактное):

 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)] 
  • языковой файл не загружается автоматически в Django
  • Лучший способ доступа к N-й строке файла csv
  • Как обнаружить столкновение в pygame?
  • Django: MEDIA_URL не установлен в шаблоне
  • Перемещение спрайта на другую сторону при удалении спрайта с экрана Pygame
  • Страны со списком Python в словаре
  • Преобразование int в байты в Python 3
  • Настройка Python simpleHTTPserver на Windows
  • Python - лучший язык программирования в мире.