Количество строк в csv. DictReader

Кажется, есть проблема со сборкой старых драйверов NVIDIA на ядрах 4.4.0-107x-aws. Вы можете установить более новые драйверы NVIDIA, которые должны нормально работать с текущим ядром:

wget http://us.download.nvidia.com/tesla/410.104/NVIDIA-Linux-x86_64-410.104.run
sudo sh ./NVIDIA-Linux-x86_64-410.104.run --no-drm --disable-nouveau --dkms --silent --install-libglvnd 

По словам представителя AWS, драйверы были обновлены в Deep Learning AMI 21/03/2019 [ Форумы AWS ].

27
задан badp 14 June 2010 в 17:41
поделиться

3 ответа

rows = list(myreader)
totalrows = len(rows)
for i, row in enumerate(rows):
    print("Row %d/%d" % (i+1, totalrows))
35
ответ дан 28 November 2019 в 05:04
поделиться

Вам нужно открыть файл только один раз:

import csv

f = open('myFile.csv', 'rb')

countrdr = csv.DictReader(f)
totalrows = 0
for row in countrdr:
  totalrows += 1

f.seek(0)  # You may not have to do this, I didn't check to see if DictReader did

myreader = csv.DictReader(f)
for row in myreader:
  do_work

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

Примечание: «Pythonic» - это использование enumerate вместо +=, но код операции UNPACK_TUPLE настолько дорог, что делает enumerate медленнее, чем увеличение локального. При этом, вероятно, вам следует избегать ненужной микрооптимизации.

Дополнительные примечания: Если вы действительно хотите сгенерировать какой-то индикатор прогресса, он не обязательно должен основываться на записях. Вы можете tell() на объекте file в цикле и просто сообщить, через какой% данных вы прошли. Это будет немного неравномерно, но есть вероятность того, что для любого файла, который достаточно большой, чтобы гарантировать индикатор выполнения, отклонение длины записи будет потеряно из-за шума.

15
ответ дан Nick Bastin 28 November 2019 в 05:04
поделиться

Я не могу найти, как скопировать итератор.

Ближайшим является itertools.tee , но просто сделать list из него, как предполагает @JFSebastian, здесь лучше, как объясняют документы itertools.tee:

Для этого itertool может потребоваться значительное вспомогательное хранилище (в зависимости от того, сколько временных данных необходимо сохранить). В общем, если один итератор использует большую часть или все данные до запуска другого итератора, быстрее использовать list() вместо tee().

2
ответ дан Alex Martelli 28 November 2019 в 05:04
поделиться
Другие вопросы по тегам:

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