Что делает этот блок кода Python? - PullRequest
1 голос
/ 26 октября 2011

Я пишу программу на Python Hangman, и я хотел иметь возможность случайным образом генерировать слова из файла, и это работает. Но я получил одну строчку этого кода с веб-сайта, и это помогает мне делать то, что мне нужно, но я не знаю как .

Спасибо

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

Ответы [ 3 ]

7 голосов
/ 26 октября 2011

os.stat(filename)[6] просто возвращает размер в байтах файла с именем filename. Подробнее о os.stat() вы можете прочитать в документации .

random.randint(...) генерирует случайное целое число от нуля до n, где n - это размер файла, полученного с помощью os.stat().

Затем код ищет эту (случайную) позицию в файле. Скорее всего, эта позиция находится в середине линии. Поэтому код читает частичную строку и отбрасывает ее. Затем он читает следующую строку и возвращает ее.

Наконец, в коде есть ошибка: если случайная позиция попадает в последнюю строку файла, второй readline() нечего будет читать.

edit: Кроме того, как заметил @Russell Borogove в комментариях, этот метод не гарантирует, что линии выбираются с равной вероятностью.

1 голос
/ 26 октября 2011

Чтобы расширить ответ aix, после того, как у нас есть случайное целое число в пределах "диапазона" файла, мы идем в это место с fd.seek(offset).Мы используем fd.readline(), чтобы отбросить строку, на которой мы находимся, и перейти к следующей.Затем мы используем fd.readline(), чтобы вернуть всю текущую строку, в которой мы находимся.

Обратите внимание, что если вы окажетесь в последней строке файла, вы вернете пустую строку.Для демонстрации установите смещение на os.stat(filename)[6] - 1 и дважды используйте readline.

0 голосов
/ 26 марта 2012

Я пытался добавить это как комментарий, но не смог включить пример кода.

Вот код, который вы включили в исправленную ошибку последней строки / первой строки:

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.

...