微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想用一个用户输入的新单词替换在文件中出现两次的单词...

如何解决我想用一个用户输入的新单词替换在文件中出现两次的单词...

任务是:

创建一个Mad Libs程序,该程序读取文本文件,并允许用户在文本文件中出现ADJECTIVE,NOUN,ADVERB或VERB的任何位置添加自己的文本。例如,文本文件madlibs1.txt具有以下内容

ADJECTIVE熊猫先到名词,然后是动词。附近的名词是 不受这些影响

程序将发现这些情况并提示用户替换它们,如下所示:

输入一个形容词: 愚蠢 输入一个名词: 吊灯 输入动词: 尖叫 输入一个名词: 皮卡车

然后应打印以下文本: 愚蠢的熊猫走到吊灯,然后尖叫。附近的皮卡 卡车不受这些事件的影响。

我的代码如下

with open('madlibs1.txt') as f:

file = f.read()
file = file.replace('ADJECTIVE',input('Enter an adjective: '))
file = file.replace('NOUN',input('Enter a noun: '))
file = file.replace('VERB',input('Enter a verb: '))
file = file.replace('NOUN',input('Enter a noun: '))    

print(file)

但是它会打印两次枝形吊灯,因为NOUN的键已设置为用户的第一个输入。

我该怎么办?我应该使用split()还是创建一个空字典?有什么想法吗?

问候 色达

解决方法

只需创建一个模板。您可能可以使用jinja或常规python。模板有很多选项。

# my_template.txt
The {adjective1} {adjective2} fox {verb1} over the {adjective3} dog

然后只在字符串上使用格式

with open("my_template.txt","r") as f:
    contents = f.read()
    
replace = {}
replace['adjective1'] = input('Enter an adjective: ')
replace['adjective2'] = input('Enter an adjective: ')
replace['verb1'] = input('Enter an verb: ')
replace['adjective3'] = input('Enter an adjective: ')

txt = contents.format(**replace)
print(txt)

您也可以使它自动化

from string import digits


remove_digits = str.maketrans('','',digits)


def find_variables(contents):
    """Iterator that yields (variable name,variable type) found 
    in the given contents.
    """
    while True:
        idx = contents.find('{')
        if idx == -1:
            break

        idx2 = contents[idx:].find('}')
        if idx2 == -1:
            break

        varname = contents[idx+1:idx2]
        var_type = varname.translate(remove_digits)  # Not Tested
        contents = contents[idx2:]

        yield varname,var_type


with open("my_template.txt","r") as f:
    contents = f.read()

replace = {varname: input('Enter one {}:'.format(var_type))
           for varname,var_type in find_variables(contents)}
    
txt = contents.format(**replace)
print(txt)
,

如果您无法更改文件,则可以使用此文件。

with open('madlibs1.txt') as f:
    for line in f.readlines():
        line = line.strip("\n")
        newline = ""

        for word in line.split(" "):
            
        
            if word.startswith(('ADJECTIVE','NOUN','VERB')):
                if word.endswith((',','.')): word,punctuation = word[:-1],word[-1]
                
                word = input(f'Enter a {word}')

                if punctuation:
                    word += punctuation
                    punctuation = ""

            newline = " ".join([newline,word]) if newline else word
        print(newline)

# 'The red panda walked to the dog and then sit. A nearby cat was unaffected by these events.'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?