Вам нужно открыть файл только один раз:
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 в цикле и просто сообщить, через какой% данных вы прошли. Это будет немного неровно, но есть вероятность, что для любого файла, который достаточно велик, чтобы гарантировать наличие индикатора выполнения, отклонение длины записи будет потеряно из-за шума.