2013-11-15 42 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

你是什麼意思「它沒有工作」?你能分享所需的輸出和實際輸出嗎? – 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

開始:在您的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返回7enumerate(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中,那麼做到這一點更合理,然後從列表中選擇一行,就像Robᵩ的回答一樣。