Python 3 – поиск строки в большом текстовом файле по номеру строки

Название в значительной степени говорит само за себя: я потратил более дня на то, чтобы выяснить, как извлечь одну строку текста из большого текстового файла, введя номер строки, но безуспешно. До сих пор кажется, что единственные решения, о которых люди говорят в Интернете, загружают весь текстовый файл в список, но он просто слишком велик для этого. Структура файла .txt, с которым я работаю, буквально представляет собой большой список URL-адресов, по одному в строке.

Я пытался использовать handle.readline(), но это не помогло определить конкретную строку. Поскольку файл такой большой, я не могу оправдать загрузку всех его строк в память с помощью метода handle.readlines(), так что это тоже провал. Я попытался написать функцию, используя for index,line in enumerate(handle), найденную в Интернете, но она странным образом возвращает None. Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: некоторый код ниже не работает:

fh = open("file.txt","a+")

def offsetfunc(handle,lineNum):
    line_offset = []
    offset = 0
    for line in handle:
        line_offset.append(offset)
        offset += len(line)
    handle.seek(line_offset[lineNum-1],0)

offsetfunc(fh,1)        #Returns IndexError
print(fh.readline())    #Presumably would be viable, if the previous statement worked?

Кроме того, использование метода linecache загружает файл в память, так что да, это тоже нежизнеспособно.


person Mew    schedule 12.02.2018    source источник
comment
Как handle.readline не является хорошим решением?   -  person Ilija    schedule 13.02.2018
comment
Возможный дубликат Как перейти к конкретная строка в огромном текстовом файле?   -  person bla    schedule 13.02.2018
comment
Это не дает возможности настроить таргетинг на одну строку, которую я хочу, просто так. (Аргумент для него указывает не номер строки, а скорее байт.)   -  person Mew    schedule 13.02.2018
comment
Попробуйте предоставить фрагмент кода с комментариями, чтобы люди могли давать более связные ответы/предложения.   -  person Theo    schedule 13.02.2018
comment
Там не так много кода, так как все, что дано, представляет собой большой .txt, упомянутый с описанной структурой, и, кроме того, номер строки; Я попробовал метод, предложенный @Robᵩ, а также те, что в посте выше, но ни один из них не помог.   -  person Mew    schedule 13.02.2018
comment
@Mew все это должно работать, как и подход Роба. Вам нужно будет предоставить минимальный воспроизводимый пример, если он не работает.   -  person juanpa.arrivillaga    schedule 13.02.2018


Ответы (1)


Эта программа может делать то, что вы хотите:

def fetch_one_line(filename, linenumber):
    with open(filename) as handle:
        for n, line in enumerate(handle, 1):
            if n == linenumber:
                return line
    print("OOPS! There aren't enough lines in the file")
    return None

my_line = fetch_one_line('input.txt', 5)
print(repr(my_line))
person Robᵩ    schedule 12.02.2018
comment
По-прежнему возвращает None, хотя строк много! - person Mew; 13.02.2018
comment
Он печатает OOPS? - person Robᵩ; 13.02.2018
comment
Да, он печатает OOPS. - person Mew; 13.02.2018
comment
Тогда точно не хватает строк в файле. Можете ли вы открыть текстовый редактор и создать 7-строчный файл с именем input.txt и запустить указанную выше программу? - person Robᵩ; 13.02.2018
comment
Я сделал именно так, и он все еще возвращает OOPS и None. - person Mew; 13.02.2018
comment
О, я, возможно, нашел свою ошибку. Правильно ли я использовал handle = open(filename,"r+") вместо with open(filename) as handle? Я решил, что мне не нужен синтаксис with, так как файл уже открыт в начале программы. - person Mew; 13.02.2018