import json
import random
import os
import re
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os, re
import random,readJSON
data = readJSON.读JSON文件("data.json")
名人名言 = data["famous"] # a 代表前面垫话,b代表后面垫话
前面垫话 = data["before"] # 在名人名言前面弄点废话
后面垫话 = data['after'] # 在名人名言后面弄点废话
古诗词 = data['bosh'] #古诗词
xx = "诗意"
重复度 = 2
def 洗牌遍历(列表):
global 重复度
池 = list(列表) * 重复度
while True:
random.shuffle(池)
for 元素 in 池:
yield 元素
下一句古诗词 = 洗牌遍历(古诗词)
下一句名人名言 = 洗牌遍历(名人名言)
def 来点名人名言():
global 下一句名人名言
xx = next(下一句名人名言)
xx = xx.replace( "a",random.choice(前面垫话) )
xx = xx.replace( "b",random.choice(后面垫话) )
return xx
def 另起一段():
xx = ". "
xx += "\r\n"
xx += " "
return xx
# 限定可见方法
__all__ = ["ChineseName"]
# ================
# 资源文件
# ================
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
LASTFILE = os.path.join(BASE_DIR, "source/lastnames.txt")
FIRSTFILE = os.path.join(BASE_DIR, "source/firstnames.txt")
BOYFILE = os.path.join(BASE_DIR, "source/boy.json")
GIRLFILE = os.path.join(BASE_DIR, "source/girl.json")
# ===================
# 主体代码
# ===================
class ChineseName(object):
"""中文名取名"""
def __init__(self, firstname_file=FIRSTFILE, lastname_file=LASTFILE):
"""初始化
Args:
firstname_file: 名字文件路径 - String
lastname_file:姓氏文件路径 - String
以上两个路径参数有默认值,也可由用户自定义,文件内容以空格分隔即可
"""
# 存储名字,便于多次调用 - List
self._firstnames = self._getChars(firstname_file)
# 存储姓氏,便于多次调用 - List
self._lastnames = self._getChars(lastname_file)
self._loadFirstName()
def _getChars(self, filename):
"""获取中文字符列表
Args:
filename: 文件路径 - String (空格分隔文件)
Returns:
List: 字符列表
Raise:
file not find
"""
if os.path.exists(filename):
with open(filename, "r", encoding="utf-8") as f:
chars = f.read().split(" ")
return chars
else:
raise IOError("file not find!")
def _loadFirstName(self):
"""
加载男孩女孩名字
"""
# 加载男孩名字 {dict}
with open(BOYFILE, "r", encoding="utf-8") as f:
self._boy_firstnames = json.loads(f.read())
# 加载女孩名字 {dict}
with open(GIRLFILE, "r", encoding="utf-8") as f:
self._girl_firstnames = json.loads(f.read())
def getLastName(self):
"""获取姓氏
Args:
None
Returns:
String: 姓氏
"""
return random.choice(self._lastnames)
def _getFirstName(self, char_count=1, sex="boy"):
"""
获取名字
:param char_count: {int} 名字字数
:param sex: {str} 性别 (boy | girl)
:return: {srt} 名字
"""
firstnames = {
"boy": self._boy_firstnames,
"girl": self._girl_firstnames
}
try:
return random.choice(firstnames.get(sex).get(str(char_count)))
except KeyError:
raise KeyError("please input char_count between 1-2")
def getGirlFirstName(self, char_count=1):
"""
获取一个女孩名字
:param char_count: {int} 名字字数
:return: {str} 名字
"""
return self._getFirstName(char_count, sex="girl")
def getBoyFirstName(self, char_count=1):
"""
获取一个男孩名字
:param char_count: {int} 名字字数
:return: {str} 名字
"""
return self._getFirstName(char_count, sex="boy")
def getFirstName(self, char_count=1, sex=None):
"""获取名字
Args:
char_count: {int} 名字长度,默认1
sex: {str} 性别(boy | girl)
Returns:
String: 名字
"""
if sex == "boy":
firstname = self.getBoyFirstName(char_count)
elif sex == "girl":
firstname = self.getGirlFirstName(char_count)
else:
firstname = []
for i in range(char_count):
firstname.append(random.choice(self._firstnames))
firstname = "".join(firstname)
return firstname
def getName(self, char_count=1, lastname="", sex=None):
"""获取一个中文姓名
Args:
char_count: 名字长度,默认1 - Integer
lastname: 姓氏,默认随机 - String
sex: {str} 性别(boy | girl)
Returns:
String: 姓名
"""
name = []
if lastname == "":
name.append(self.getLastName())
else:
name.append(lastname)
name.append(self.getFirstName(char_count, sex))
name = "".join(name)
return name
def getBoyName(self, char_count=1, lastname=""):
"""
获取男孩姓名
:param char_count: {int} 名字长度,默认1
:param lastname: {str} 姓氏 默认随机
:return: {str} 姓名
"""
return self.getName(char_count, lastname, sex="boy")
def getGirlName(self, char_count=1, lastname=""):
"""
获取女孩姓名
:param char_count: {int} 名字长度,默认1
:param lastname: {str} 姓氏 默认随机
:return: {str} 姓名
"""
return self.getName(char_count, lastname, sex="girl")
def getNames(self, count, char_count=1, lastname="", sex=None):
"""获取一个中文姓名列表
Args:
count: 名字数量 - Integer
char_count: 名字长度,默认1 - Integer
lastname: 姓氏,默认随机 - String
sex: {str} 性别(boy | girl)
Returns:
List: 姓名列表
"""
names = []
for i in range(count):
names.append(self.getName(char_count, lastname, sex))
return names
def getNameGenerator(self, count, char_count=1, lastname="", sex=None):
"""获取一个中文姓名生成器,2018年1月22日
Args:
count: 名字数量 - Integer
char_count: 名字长度,默认1 - Integer
lastname: 姓氏,默认随机 - String
sex: {str} 性别(boy | girl)
Returns:
Yield:姓名生成器
"""
for i in range(count):
yield self.getName(char_count, lastname, sex)
def ask_for_name_generation():
count = int(input("请输入生成姓名的数量:"))
char_count_input = input("是否指定姓名长度?(是/否,默认为1):")
if char_count_input.lower() == "是":
char_count = int(input("请输入姓名长度:"))
else:
char_count = 1
lastname = input("是否指定姓氏?(是/否,默认随机选择):")
if lastname.lower() == "是":
lastname = input("请输入姓氏:")
else:
lastname = ""
sex_input = input("是否指定性别?(是/否,默认为None):")
if sex_input.lower() == "是":
sex = input("请输入性别(boy是1/girl是0):")
sex = "boy" if sex == "1" else "girl"
else:
sex = None
# 调用提供的函数
cname = ChineseName()
generator = cname.getNameGenerator(count=count, char_count=char_count, lastname=lastname, sex=sex)
# 遍历生成器并输出姓名
print("生成的姓名如下:")
for name in generator:
print(name)
xx = input("请输入名字(如果不想解释可以ENTER):")
for x in xx:
tmp = str()
while ( len(tmp) < 100 ) :
分支 = random.randint(0,100)
if 分支 < 5:
tmp += 另起一段()
elif 分支 < 20 :
tmp += 来点名人名言()
else:
tmp += next(下一句古诗词)
tmp = tmp.replace("x",xx)
print(tmp)
while True:
satisfaction = input(f"您是否满意这个名字和这段文本?(是/否):")
if satisfaction.lower() == '是':
print("感谢您的反馈!")
return True
elif satisfaction.lower() == '否':
print("好的,您可以重新查询并生成。")
return False
else:
print("请输入'是'或'否'。")
# 调用函数
ask_for_name_generation()