这段Python代码有什么作用?

时间:2011-10-26 14:58:25

标签: python file file-io random

我正在编写一个python hangman程序,我希望能够从文件中随机生成一个单词,并且它可以工作。但我从网站上获得了一行此代码,这有助于我做我需要做的事情,但我不知道如何

由于

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

3 个答案:

答案 0 :(得分:7)

os.stat(filename)[6]只返回filename命名的文件的大小(以字节为单位)。您可以详细了解os.stat() in the documentation

random.randint(...)生成0到n之间的随机整数,其中n是通过os.stat()获得的文件的大小。

然后代码寻找文件中的(随机)位置。很有可能这个位置在一条线的中间。因此,代码读取部分行并丢弃它。然后它读取下一行并返回它。

最后,代码有一个错误:如果随机位置落在文件的最后一行,则第二个readline()将无法读取。

编辑另外,正如@Russell Borogove在评论中指出的那样,此方法无法确保以相同的概率选择行。

答案 1 :(得分:1)

要扩展aix的答案,我们在"范围内有一个随机整数"对于该文件,我们使用fd.seek(offset)转到该位置。我们使用fd.readline()删除我们所在的行,然后转到下一行。然后我们使用fd.readline()返回我们所在的整个当前行。

请注意,如果您最终在文件的最后一行,您将返回一个空字符串。要演示将偏移设置为os.stat(filename)[6] - 1并使用readline两次。

答案 2 :(得分: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()

它不能解决@ russell-borogove所描述的均匀性问题。