2011-10-26 119 views
1

我正在編寫一個python hangman程序,我希望能夠從一個文件中隨機生成一個單詞,並且它可以工作。但是我從網站上得到了一行代碼,它幫助我做我需要做的事情,但我不知道如何這段Python代碼是做什麼的?

感謝

offset = random.randint(0, os.stat(filename)[6]) # ????? 
    fd = file(filename, 'rb') 
    fd.seek(offset) 
    fd.readline() 
    return fd.readline() 
+0

在未來,如果您從網站上下載了哪條線路,以便我們知道哪條線路可以幫助您,它將會很有幫助。 – ewok

回答

7

os.stat(filename)[6]只是返回的大小,以字節爲單位,由filename命名的文件中。你可以閱讀更多關於os.stat()in the documentation

random.randint(...)生成零和n之間的隨機整數,其中n是通過os.stat()獲取的文件的大小。

該代碼然後尋找該文件中的(隨機)位置。有可能這個位置在一條線的中間。因此,代碼讀取部分行並丟棄它。然後讀取下一行並返回。

最後,代碼有一個錯誤:如果隨機位置落在文件的最後一行,第二個readline()將沒有東西可讀。

編輯:另外,正如@Russell Borogove在評論中指出的那樣,這種方法並不能確保以相等的概率選擇行。

+0

其實,我只是想知道第一行,不過謝謝。你很有幫助。 –

+0

@AhmadGaffoor:我已經解釋了其餘部分,以揭露我在最後一段中提到的錯誤。 – NPE

+0

謝謝,我很感謝 –

1

要擴展aix的答案,在文件的「範圍」內有一個隨機整數後,我們用fd.seek(offset)去那個位置。我們使用fd.readline()來刪除我們所在的行,然後轉到下一行。然後我們使用fd.readline()來返回我們所在的整個當前行。

請注意,如果您最終在文件的最後一行,您將返回一個空字符串。爲了演示,設置您的偏移量爲os.stat(filename)[6] - 1並使用readline兩次。

0

我試圖添加此作爲註釋,但不能包含代碼示例。

這裏是你包含固定的最後/第一行的錯誤代碼:

size = os.stat(filename)[6] 
offset = random.randint(0, size) # ????? 
fd = file(filename, 'rb') 
fd.seek(offset) 
fd.readline() 
if fd.tell() == size: 
    fd.seek(0) 
return fd.readline() 

由@羅素borogove描述它不能解決問題的均勻性。