Файл произвольного доступа Python - PullRequest
12 голосов
/ 15 февраля 2011

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

Любые типы или методы приветствуются.

Ответы [ 7 ]

14 голосов
/ 15 февраля 2011

Это похоже на то, для чего mmap был разработан. Объект mmap создает строковый интерфейс для файла:

>>> f = open("bonnie.txt", "wb")
>>> f.write("My Bonnie lies over the ocean.")
>>> f.close()
>>> f.open("bonnie.txt", "r+b")
>>> mm = mmap(f.fileno(), 0)
>>> print mm[3:9]
Bonnie

Если вам интересно, mmap объектам также можно присвоить:

>>> print mm[24:]
ocean.
>>> mm[24:] = "sea.  "
>>> print mm[:]
My Bonnie lies over the sea.  
6 голосов
/ 17 июля 2014

Вы можете использовать linecache :

import linecache
print linecache.getline(your_file.txt, randomLineNumber) # Note: first line is 1, not 0
6 голосов
/ 15 февраля 2011

Поскольку строки могут быть произвольной длины, вы действительно не можете получить случайную строку (подразумеваете ли вы «строку, число которой на самом деле является случайным» или «строку с произвольным числом, выбранным мной») без обходавесь файл.

Если достаточно kinda-sorta-random, вы можете искать случайное место в файле и затем читать вперед, пока не дойдете до конца строки.Но это бесполезно, если вы хотите найти (скажем) номер строки 1234, и будет производить выборку строк неравномерно, если вы действительно хотите случайно выбранную строку.

1 голос
/ 15 февраля 2011

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

В противном случае загрузите ваш файл в базу данных SQLlite.Запрос это.

1 голос
/ 15 февраля 2011

Объект File поддерживает поиск, но убедитесь, что вы открываете их как двоичные файлы, то есть "rb".

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

1 голос
/ 15 февраля 2011

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

Код:

import sys,random
with open(sys.argv[1],"r") as f:
    f.seek(0,2)                 # seek to end of file
    bytes = f.tell()
    f.seek(int(bytes*random.random()))

    # Now seek forward until beginning of file or we get a \n
    while True:
        f.seek(-2,1)
        ch = f.read(1)
        if ch=='\n': break
        if f.tell()==1: break

    # Now get a line
    print f.readline()
1 голос
/ 15 февраля 2011

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

...