从文件中读取代码行并随机执行其中一行

时间:2017-09-02 21:00:23

标签: python

我可能在标题中奇怪地解释了它,但这是我的问题。我正在制作一个小句子生成程序并选择句子,它选择一个随机句子结构。

我希望在不同的行上有一个包含不同结构代码的文件,如下所示:

random.choice(blankThat)+" "+sentenceSubject+" "+random.choice(description)+"."
random.choice(questionBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"?"
random.choice(pastBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"."
random.choice(subjectBegin)+" "+sentenceSubject+"."
random.choice(subjectQuestion)+" "+sentenceSubject+"?"
sentenceSubject+" "+random.choice(description)+"."
sentenceSubject+" "+random.choice(pastDescription)+"."
random.choice(subjectBeginExclaim)+" "+sentenceSubject+"!"
random.choice(songList)+" "+random.choice(["is","was"])+" "+random.choice(adverbs)+" "+random.choice(adjectives)+"."
sentenceSubject+" "+"is"+" "+random.choice(describers)+"."

我如何随机选择执行上述代码行之一?我尝试使用这个简单的代码随机选择一个......

templateFile = open("structures.txt","a+")
templates = templateFile.readlines()
templates = [y.strip() for y in templates]
finalSentence = random.choice(templates)

但是当我print(finalSentence)时,它只是吐出一条线而不是执行它:

random.choice(pastBegin)+" "+sentenceSubject+" "+random.choice(pastDescription)+"."

如何随机选择并执行其中一行?如果我能从文件中读取结构,我会更喜欢它,因为我会定期添加新的句子结构。

3 个答案:

答案 0 :(得分:3)

这里有你能做什么的草图。看起来您的文件的每一行都使用三种类型的表达式:

  • " is "
  • 这样的字符串文字
  • 引用常量字符串,例如sentenceSubject
  • 来自字符串集合的随机选择,例如random.choice(blankThat)

创建可识别这些表达式的迷你语言。 E.g:

?blankThat " " !sentenceSubject " " ?description "."

创建所有常量字符串的字典,例如:

strings = {"sentenceSubject" : "Hello, world", ...}

创建所有字符串集合的字典,例如:

collections = {"blankThat" : ["foo", "bar", ...],
               "description" : ["dog", "cat", ...], ...}

编写一个迷你解析器,它接受用迷你语言编写的字符串,将其分解为表达式,通过令牌的第一个字符确定每个表达式的类型,并将其转换为正确的字符串:

  • ?X - >随机查找,在collections中找到X,调用random.choice(collections[X])
  • !X - >常量字符串,找到strings[X]
  • " X" - >字符串文字,只需使用X

最后,结合所有翻译件。希望它有所帮助。

答案 1 :(得分:2)

这不是您问题的直接答案,但我认为这可能会有所帮助。考虑构建和生成此信息的不同方法。这是一个简单而不完美的例子,但我认为这可能是一个很好的起点:

import random

subject = "Jeremy"
descriptions = ["cool", "tall", "strong"]
hobbies = ["running", "coding"]

def sentence_maker3000():
    sentence_vals = {"subject": subject, "descriptions": random.choice(descriptions), "hobbies": random.choice(hobbies)}
    valid_sentences = ["{subject} is {descriptions}", "{subject} likes {hobbies}"]

    sentence = random.choice(valid_sentences).format(**sentence_vals)

    return sentence

print(sentence_maker3000())  # Might print "Jeremy is cool" or "Jeremy likes coding"

您可以使用Python的格式括号构建所有有效句子。非常容易阅读,写得更短。

您可以将这些有效句子写在单独的文本文件中,如下所示:

{subject} is {descriptions}
{subject} likes {hobbies}

然后将valid_sentences作业替换为:

with open('input.txt', 'r') as f:
    valid_sentences = f.read().splitlines()

答案 2 :(得分:0)

使用

print(eval(finalSentence))

而不是print(finalSentence)eval(str)所做的是它需要一个字符串并像运行普通代码一样运行它。