import random
не вызывает randrange
для определения; он вызывает random
, чтобы стать определены, а random
модуль имеет функцию с именем randrange
в нем, так что вы можете сделать это:
for i, line in enumerate(f, random.randrange(1,14)):
Или, в качестве альтернативы, вы можете from random import randrange
.
Дополнительную информацию см. В разделе урока по Modules.
Как только вы исправите это, ваш код будет работать, но ваш алгоритм на самом деле не правильный.
Скажем, randrange
возвращает 7
. enumerate(f, 7)
возвращает первую строку файла и номер 7, затем вторую строку и номер 8, и так далее. Так что i
никогда не будет 1
, и вы никогда ничего не напечатаете.
Для того, чтобы выполнить эту работу, вам нужно сравнить i
со случайным числом. Как это:
line_number = random.randrange(1, 14)
for i, line in enumerate(f):
if i == line_number:
break
Конечно, это все еще только выбирает случайную строку в диапазоне [1, 14), а не какой-либо строки в файле. И, если файл слишком короткий, он будет тяжелым весом до последней строки.
Итак, что вам нужно действительно нужно сделать, это получить количество строк, а затем выбрать случайное число в randrange(count_of_lines)
, а затем использовать это. Но вы не можете получить количество строк, не читая весь файл. В этот момент вам придется закрыть его и прочитать его снова, чтобы получить тот, который вы хотите. (Хотя здесь может быть полезно linecache
). Все это довольно сложно.Итак, если у вас достаточно памяти для чтения всего файла в list
, имеет смысл просто сделать это, а затем выбрать строку из списка, как в ответе Роба.
Что вы подразумеваете под словом "it does not work"? Можете ли вы поделиться желаемым выходом и фактическим выходом? – codegeek
и след, если есть один – Paco