如何从文本文件中选择随机行

Sui*_*pps 9 python random file python-3.3

我正在尝试为我的学校制作一个彩票计划(我们有一个经济系统).

我的程序生成数字并将其保存到文本文件中.当我想从我的发电机中"拉出"数字时,我希望它确保有一个胜利者.

问:我如何让Python从我的文本文件中选择一个随机行并将输出作为该数字?

NPE*_*NPE 15

我怎么让python从我的文本文件中选择一个随机行并将我的输出作为该数字?

假设文件相对较小,以下可能是最简单的方法:

import random
line = random.choice(open('data.txt').readlines())
Run Code Online (Sandbox Code Playgroud)


Ali*_*fee 12

如果文件非常大 - 您可以在给定文件大小的文件中寻找随机位置,然后获取下一个完整行:

import os, random 
def get_random_line(file_name):
    total_bytes = os.stat(file_name).st_size 
    random_point = random.randint(0, total_bytes)
    file = open(file_name)
    file.seek(random_point)
    file.readline() # skip this line to clear the partial line
    return file.readline()
Run Code Online (Sandbox Code Playgroud)

  • 该方法会使较短的线条被选中的机会较小,因此如果您真的希望随机生成器选择具有相同概率的每条线路,那么这不是一个好的选择. (4认同)

ian*_*kit 5

def random_line():
    line_num = 0
    selected_line = ''
    with open(filename) as f:
        while 1:
            line = f.readline()
            if not line: break
            line_num += 1
            if random.uniform(0, line_num) < 1:
                selected_line = line
    return selected_line.strip()
Run Code Online (Sandbox Code Playgroud)

虽然这里给出的大多数方法都有效,但它们倾向于将整个文件一次加载到内存中.但不是这种方法.因此,即使文件很大,这也行得通.

乍一看,这种方法并不是很直观.这背后的定理指出,当我们看到N条线存在恰好1/N的概率时,到目前为止它们中的每一条都被选中.

来自'Python Cookbook '的第123页