Как перейти к конкретной строке в огромном текстовом файле?

Я делаю следующее:

drv <- ROracle::Oracle()
sapply(ROracle::dbListConnections(drv), ROracle::dbDisconnect)
102
задан Jaffer Wilson 12 September 2017 в 06:05
поделиться

10 ответов

linecache:

linecache модуль позволяет получать любую строку от исходного файла Python, при попытке оптимизировать внутренне, использовании кэша, общий падеж, где много строк читаются из единственного файла. Это используется traceback модуль для получения исходных строк для включения в отформатированный traceback...

27
ответ дан gnat 24 November 2019 в 04:30
поделиться

Вот пример с помощью 'readlines (sizehint)' для чтения блока строк за один раз. DNS указал на то решение. Я записал этот пример, потому что другими примерами здесь является ориентированная одна строка.

def getlineno(filename, lineno):
    if lineno < 1:
        raise TypeError("First line is line 1")
    f = open(filename)
    lines_read = 0
    while 1:
        lines = f.readlines(100000)
        if not lines:
            return None
        if lines_read + len(lines) >= lineno:
            return lines[lineno-lines_read-1]
        lines_read += len(lines)

print getlineno("nci_09425001_09450000.smi", 12000)
1
ответ дан Andrew Dalke 24 November 2019 в 04:30
поделиться

Сами строки содержат информацию об индексе? Если бы содержание каждой строки было чем-то как" <line index>:Data", то тогда эти seek() подход мог использоваться, чтобы сделать двоичный поиск через файл, даже если сумма Data является переменной. Вы искали бы на среднюю точку файла, считать строку, проверить, выше ли ее индекс или ниже, чем тот, который Вы хотите, и т.д.

Иначе, лучшее, которое можно сделать, всего readlines(). Если Вы не хотите читать все 15 МБ, можно использовать sizehint аргумент, чтобы, по крайней мере, заменить много из readline() с с меньшим числом вызовов к readlines().

2
ответ дан DNS 24 November 2019 в 04:30
поделиться

Если Вы знаете заранее положение в файле (скорее номер строки), можно использовать file.seek () для движения в то положение.

Редактирование : можно использовать linecache.getline (имя файла, lineno) функция, которая возвратит содержание строки lineno, но только после чтения всего файла в память. Хороший, если Вы случайным образом получаете доступ к строкам из файла (поскольку сам Python мог бы хотеть сделать для печати traceback), но не хороший для файла 15 МБ.

3
ответ дан Noah 24 November 2019 в 04:30
поделиться

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

from itertools import dropwhile

def iterate_from_line(f, start_from_line):
    return (l for i, l in dropwhile(lambda x: x[0] < start_from_line, enumerate(f)))

for line in iterate_from_line(open(filename, "r", 0), 141978):
    DoSomethingWithThisLine(line)

Примечание: индекс является нулем, базирующимся в этом подходе.

5
ответ дан 24 November 2019 в 04:30
поделиться

Я, вероятно, испорчен богатым поршнем, но 15 М не огромны. Чтение в память с readlines() - то, что я обычно делаю с файлами этого размера. Доступ к строке после этого тривиален.

12
ответ дан Alex 24 November 2019 в 04:30
поделиться

У Вас действительно нет этого многими опциями, если строки имеют другую длину... печально необходимо обработать конечные символы строки для знания, когда Вы прогрессировали до следующей строки.

можно, однако, существенно ускорить это И уменьшить использование памяти путем изменения последнего параметра для "открытий" к чему-то не 0.

0 означает, что операция чтения файла освобождена буфер, который является очень медленным и интенсивный диск. 1 означает, что файл является буферизованной строкой, который был бы улучшением. Что-либо выше 1 (говорят 8k.. т.е.: 8096, или выше), читает блоки файла в память. Вы все еще получаете доступ к нему до for line in open(etc):, но Python только идет понемногу, отбрасывая каждый буферизированный блок после его обработанного.

20
ответ дан Jarret Hardie 24 November 2019 в 04:30
поделиться

Вы не можете перейти вперед, не читая в файле, по крайней мере, однажды, так как Вы не знаете, где разрывы строки. Вы могли сделать что-то как:

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
111
ответ дан Adam Rosenfield 24 November 2019 в 04:30
поделиться

Если Вы не хотите читать весь файл в памяти.. Вы, возможно, должны придумать некоторый формат кроме простого текста.

, конечно, все это зависит от того, что Вы пытаетесь сделать, и как часто Вы перейдете через файл.

, Например, если Вы собираетесь перейти к строкам много раз в том же файле, и Вы знаете, что файл не изменяется при работе с ним, можно сделать это:
Первый, пройдите через целый файл и запишите "искать-местоположение" некоторых ключевых номеров строки (такой как, когда-либо 1 000 строк),
Тогда, если Вы хотите строку 12005, переход к позиции 12 000 (который Вы записали), тогда читает 5 строк, и Вы будете знать, что в гармонии 12005 и так далее

4
ответ дан hasen 24 November 2019 в 04:30
поделиться

Что генерирует файл, который вы хотите обработать? Если это что-то под вашим контролем, вы можете сгенерировать индекс (какая строка в какой позиции) во время добавления файла. Индексный файл может иметь фиксированный размер строки (заполненные пробелами или 0 числа) и определенно будет меньше. И поэтому их можно быстро читать и обрабатывать.

  • Какая строка вам нужна ?.
  • Вычислить байтовое смещение соответствующего номера строки в индексном файле (возможно, потому что размер строки индексного файла постоянный).
  • Используйте поиск или что-то еще, чтобы напрямую перейти к строке из индексного файла.
  • Выполните синтаксический анализ, чтобы получить смещение в байтах для соответствующей строки фактического файла.
3
ответ дан 24 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: