2011-10-26 168 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描述它不能解决问题的均匀性。