2013-11-15 2 views
1

Я довольно новичок в python и был назначен заданием. Мне нужно случайным образом сгенерировать слово из .txt-файла. Я могу получить определенные строки, такие как строка 2 или строка 5, однако я хочу случайным образом генерировать то, что извлекается.Произвольно сгенерируйте строку из .txt-файла

Это то, что я в настоящее время

input("Press Enter to continue...") 

with open('words.txt') as f: 
    for i, line in enumerate(f, 1): 
     if i == 1: 
     break 
print (line) 

Я попытался сделать это, но он просто придумал randrange не определен

input("Press Enter to continue...") 

import random 
with open('words.txt') as f: 
    for i, line in enumerate(f, randrange(1,14)): 
     if i == 1: 
     break 
print (line) 
+0

Что вы подразумеваете под словом "it does not work"? Можете ли вы поделиться желаемым выходом и фактическим выходом? – codegeek

+0

и след, если есть один – Paco

ответ

2

Чтобы выбрать одну строку случайным образом из файла:

import random 
with open('/etc/passwd') as f: 
    print (random.choice(list(f))) 

Чтобы выбрать произвольную строку из файла, скажем я -я линия:

with open('/etc/passwd') as f: 
    print (list(f)[i]) 

Или это может более эффективны:

import itertools 
with open('/etc/passwd') as f: 
    print (next(itertools.islice(f, i, i+1))) 

Тем не менее, «самый простой и, безусловно, наиболее эффективным способом выбора произвольной строки из файла является linecache.getline('/etc/password', i). " - abarnert

+0

Недопустимый синтаксис - это все, что я получаю. – JohnTheBadge

+0

О, вы используете python3. Момент. Там это должно исправить. –

+0

Самый простой и почти наверняка самый эффективный способ выбора произвольной строки из файла - 'linecache.getline ('/ etc/password', i)'. – abarnert

0

Start, добавив теперь необходимое закрывающую скобку до: в конце вашего заявления for.

+0

Спасибо, что теперь randrange не определен. – JohnTheBadge

1

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, имеет смысл просто сделать это, а затем выбрать строку из списка, как в ответе Роба.

Смежные вопросы