【问题标题】:Printing random names on a file在文件上打印随机名称
【发布时间】:2015-10-28 19:18:39
【问题描述】:

我想知道如何从文件中打印随机名称。基本上有3个文件,分别是姓、男名和女名。这些文件不仅仅是名称。他们也有数字。以下是文件的示例:

    SMITH   1.006    2,501,922  1
    JOHNSON 0.81     2,014,470  2
    WILLIAMS    0.699    1,738,413  3
    JONES   0.621    1,544,427  4
    BROWN   0.621    1,544,427  5
    DAVIS   0.48     1,193,760  6
    MILLER  0.424    1,054,488  7
    WILSON  0.339    843,093    8
    MOORE   0.312    775,944    9

我希望输出打印出姓氏和名字(没有数字)这是我的代码到目前为止。它有效,但它打印出数字。

随机导入

def random_names(surname,male_names,female_names,integer):
names1 = open('surnames.txt', 'r')
names2 = open('malenames.txt', 'r')
names3 = open('femalenames.txt', 'r')
read1=names1.read().split()
read2=names2.read().split()
read3=names3.read().split()

gender_options = ('male', 'female')
count = 0

while count<integer:
    gender_pick=random.choice(gender_options)

    if gender_pick == 'male':
        first_name=random.choice(read2)
    elif gender_pick == 'female':
        first_name=random.choice(read3)

    last_name=random.choice(read1)
    print (first_name,last_name)
    count = count+1


random_names('surnames.txt', 'malenames.txt', 'femalenames.txt',10)

即使我将其修改为 read2[0] read1[0] read3[0],它也只是打印出字母。

J M
S H
E T
R I
A I
M H
J S
A I
M I
Y S

【问题讨论】:

  • 您对read2[0]read1[0]等有何修改?
  • 另外,在您的txt 文件中,所有列都由特定数量的空格分隔(或者是任意数量的空格)?
  • names1.read().split() 将读取整个文件,然后在所有空白处进行拆分,包括换行符、空格和制表符。你最终会得到类似['SMITH', '1.006', '2,501,922', '1', JOHNSON 0.81 ]
  • @AnandSKumar 我更改了while循环中的部分。
  • @AnandSKumar 主要由制表符分隔。小数部分后面的部分用制表符和空格隔开。

标签: python list file random


【解决方案1】:

定义一个函数get_names(filename),从文件中提取所有名称,例如:

def get_names(filename):
    with open(filename) as file:
        return [line.split(None, 1)[0] for line in file if line.strip()]

单独测试它,然后在你的脚本中使用它,例如:

#!/usr/bin/env python
import itertools
import random

def generate_random_names(surnames, male_names, female_names,
                          choose=random.choice):
    while True:
        # make male/female names equally likely
        forename = choose(choose([male_names, female_names]))
        yield forename, choose(surnames)

name_lists = map(get_names, ['surnames.txt', 'malenames.txt', 'femalenames.txt'])
fullnames = generate_random_names(*name_lists)    
print(list(itertools.islice(fullnames, 50)))

此代码可能会生成重复的全名。要从总体中选择k 唯一 个随机元素,请改用random.sample()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2019-12-06
    • 2013-12-07
    相关资源
    最近更新 更多