Ленивый метод для чтения большого файла в Python?

Не перекрестный браузер, но я думаю, что это сработает. Должно быть, после загрузки jquery, или вам придется переписать его на простом Javascript.

<script type="text/javascript">
$.each(document.styleSheets, function(i,sheet){
  if(sheet.href=='http://code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.css') {
    var rules = sheet.rules ? sheet.rules : sheet.cssRules;
    if (rules.length == 0) {
      $('<link rel="stylesheet" type="text/css" href="path/to/local/jquery.mobile-1.0b3.min.css" />').appendTo('head');
    }
 }
})
</script>
260
задан Pratik Deoghare 6 February 2009 в 09:25
поделиться

6 ответов

Для записи ленивой функции просто используйте yield :

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


f = open('really_big_file.dat')
for piece in read_in_chunks(f):
    process_data(piece)
<час>

Другая опция состояла бы в том, чтобы использовать iter и функция помощника:

f = open('really_big_file.dat')
def read1k():
    return f.read(1024)

for piece in iter(read1k, ''):
    process_data(piece)
<час>

, Если файл основан на строке, объект файла уже является ленивым генератором строк:

for line in open('really_big_file.dat'):
    process_data(line)
384
ответ дан nosklo 4 November 2019 в 12:11
поделиться

, Если Ваш компьютер, ОС и Python 64-разрядные , то можно использовать mmap модуль , чтобы отобразить содержание файла в память и получить доступ к нему с индексами и частями. Здесь пример из документации:

import mmap
with open("hello.txt", "r+") as f:
    # memory-map the file, size 0 means whole file
    map = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print map.readline()  # prints "Hello Python!"
    # read content via slice notation
    print map[:5]  # prints "Hello"
    # update content using slice notation;
    # note that new content must have same size
    map[6:] = " world!\n"
    # ... and read again using standard file methods
    map.seek(0)
    print map.readline()  # prints "Hello  world!"
    # close the map
    map.close()

, Если или Ваш компьютер, ОС или Python 32-разрядные , то mmap-луг большие файлы может зарезервировать значительные части Вашего адресного пространства и , исчерпали ресурсы Ваша программа памяти.

38
ответ дан Community 4 November 2019 в 12:11
поделиться

мне не разрешают прокомментировать из-за моей низкой репутации, но решение SilentGhosts должно быть намного легче с file.readlines ([sizehint])

методы файла Python

редактирование: SilentGhost является правильным, но это должно быть лучше, чем:

s = "" 
for i in xrange(100): 
   s += file.next()
1
ответ дан sinzi 4 November 2019 в 12:11
поделиться

Обратиться к официальной документации Python https://docs.python.org/zh-cn/3/library/functions.html? #iter

, Возможно, этот метод является большим количеством pythonic:

from functools import partial

"""A file object returned by open() is a iterator with
read method which could specify current read's block size"""
with open('mydata.db', 'r') as f_in:

    part_read = partial(f_in.read, 1024*1024)
    iterator = iter(part_read, b'')

    for index, block in enumerate(iterator, start=1):
        block = process_block(block)    # process block data
        with open(f'{index}.txt', 'w') as f_out:
            f_out.write(block)
1
ответ дан bruce 4 November 2019 в 12:11
поделиться

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

def get_line():
     with open('4gb_file') as file:
         for i in file:
             yield i

lines_required = 100
gen = get_line()
chunk = [i for i, j in zip(gen, range(lines_required))]

Обновление : Спасибо nosklo. Вот то, что я имел в виду. Это почти работает, за исключением того, что это теряет строку 'между' блоками.

chunk = [next(gen) for i in range(lines_required)]

Добивается цели w/o, теряющий любые строки, но это не выглядит очень хорошим.

1
ответ дан Jason Plank 4 November 2019 в 12:11
поделиться

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

-121--4746471-

File.Readlines () принимает дополнительный аргумент размера, который приближается к количеству строк, чьимых в строках, возвращаемых.

bigfile = open('bigfilename','r')
tmp_lines = bigfile.readlines(BUF_SIZE)
while tmp_lines:
    process([line for line in tmp_lines])
    tmp_lines = bigfile.readlines(BUF_SIZE)
32
ответ дан 23 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

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