почему итеративный объект не имеет длины в Python? - PullRequest
1 голос
/ 13 сентября 2011

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

Теперь я понял, что сам объект файла (или тип _io.TextIOWrapper) после открытия текстового файла является итерируемым построчно, так что, может быть, мой фрагмент кода (теперь ниже, извините за то, что пропустил его ранее) мог бы разделить его на части, если бы он мог получить его длину?Но если это итеративно, почему я не могу просто назвать его длину (по строкам, а не по байтам)?

Спасибо!

def chunks(l,n):
    """Divide a list of nodes `l` in `n` chunks"""
    l_c = iter(l)
    while 1:
        x = tuple(itertools.islice(l_c,n))
        if not x:
            return
        yield x

1 Ответ

3 голосов
/ 13 сентября 2011

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

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

Вот почему лучше не знать длину;вот почему следует иметь дело с файлами данных как Iterable, а не с коллекцией / вектором / массивом, имеющим длину.

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

Однако , если вы хотите узнать количество строк перед полной обработкой, ваши 2 варианта:

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