Используйте readline () из python для чтения определенной строки

При использовании readline () в python можно указать, какую строку читать? Когда я запускаю следующий код, я получаю строки 1,2,3, но я хотел бы читать строки 2,6,10

def print_a_line(line, f): print f.readline(line) current_file = open("file.txt") for i in range(1, 12): if(i%4==2): print_a_line(i, current_file) 

 with open('file.txt', 'r') as f: next(f) for line in f: print(line.rstrip('\n')) for skip in range(3): try: next(f) except StopIteration: break 

Файл:

 1 2 3 4 5 6 7 8 9 10 

Результат:

 2 6 10 

Это будет работать для скрипта или функции, но если вы хотите, чтобы он скрывал пропущенные строки в интерактивной оболочке, вам придется сохранить next(f) вызовы во временную переменную.

Нет, вы не можете использовать readline таким образом. Вместо этого пропустите строки, которые вы не хотите. Вы должны прочитать файл, потому что вы не можете заранее знать, где искать конкретную строку (если только новые строки не появляются в некотором регулярном смещении). Вы можете использовать перечисление, чтобы определить, в какой строке вы находитесь, поэтому вам нужно только один раз прочитать файл и остановить его после того, как вас не беспокоит.

 with open('my_file') as f: for i, line in enumerate(f, start=1): if i > 12: break if i % 4 == 0: print(i, line) 

Если вы знаете, что каждая строка имеет определенную длину байта, вы можете искать конкретную позицию для данной строки, а не повторять по строкам.

 line_len = 20 # bytes with open('my_file', 'rb') as f: for i in range(0, 13, 4): f.seek(i * line_len) print(f.read(line_len).decode()) 

Вы можете использовать рецепт потребления от itertools, который является одним из самых быстрых способов пропустить строки:

 from itertools import islice from collections import deque def consume(iterator, n): "Advance the iterator n-steps ahead. If n is none, consume entirely." # Use functions that consume iterators at C speed. if n is None: # feed the entire iterator into a zero-length deque deque(iterator, maxlen=0) else: # advance to the empty slice starting at position n next(islice(iterator, n, n), None) with open("in.txt") as f: l = [] sm = 0 for i in (2, 6, 10): i -= sm consume(f, i-1) l.append(next(f, "")) sm += i 

Нам просто нужно вычесть то, что мы уже потребляем, поэтому сохраняем линии, соответствующие каждому i. Вы можете поместить код в функцию и получить каждую строку:

 def get_lines(fle,*args): with open(fle) as f: l, consumed = [], 0 for i in args: i -= consumed consume(f, i-1) yield next(f, "") consumed += i 

Чтобы просто передать имя файла и номера строк:

test.txt:

 1 2 3 4 5 6 7 8 9 10 11 12 

Вывод:

 In [4]: list(get_lines("test.txt",2, 6, 10)) Out[4]: ['2\n', '6\n', '10\n'] In [5]: list(get_lines("stderr.txt",3, 5, 12)) Out[5]: ['3\n', '5\n', '12'] 

Если вам нужна только одна строка, вы также можете использовать linecache:

 import linecache linecache.getline("test.txt",10) 

Чтение файла всегда выполняется с первого символа. Читатель не знает содержания, поэтому не знает, где начинаются и заканчиваются линии. readline просто читает, пока не увидит символ новой строки. Это действительно верно для любого языка, а не только для Python. Если вы хотите получить n-ю строку, вы можете пропустить n-1 строки:

 def my_readline(file_path, n): with open(file_path, "r") as file_handle: for _ in range(1, n): file_handle.readline() return file_handle.readline() 

Обратите внимание, что при таком решении вам необходимо открыть файл с каждым вызовом функции, что может серьезно снизить производительность вашей программы.