我是python的新手,请原谅我的无知。
目前,我有一个文本文件,其中一些单词标记为<>。
我的目标是基本上构建一个脚本,该脚本通过带有这些标记单词的文本文件运行。每次脚本找到这样的单词时,它都会询问用户要用它替换它的内容。
例如,如果我有一个文本文件:
Today was a <<feeling>> day.
脚本将运行文本文件,因此输出将为:
Running script...
feeling? great
Script finished.
并生成一个文本文件,其中包含:
Today was a great day.
么?
编辑:感谢您提出的建议!我制作了一个脚本,大部分都像我想要的那样。就一件事。现在我正在研究如果我有多个具有相同名称的变量(例如,“我是&lt;&gt; .Bob也是&lt;&gt;。”)脚本只会提示,感觉?,一次并填写所有具有相同名称的变量。
非常感谢你的帮助。
答案 0 :(得分:8)
import re
with open('in.txt') as infile:
text = infile.read()
search = re.compile('<<([^>]*)>>')
text = search.sub(lambda m: raw_input(m.group(1) + '? '), text)
with open('out.txt', 'w') as outfile:
outfile.write(text)
答案 1 :(得分:1)
答案 2 :(得分:1)
我知道您需要有关如何构建脚本的建议,对吧?这就是我要做的事情:
raw_input
(而不仅仅是input
)。并将它们存储为字典中的值。使用字典的原因是给定的占位符可能会出现多次,您可能不希望让用户一遍又一遍地重复输入...
答案 3 :(得分:1)
基本上与@phihag提供的解决方案相同,但是采用脚本形式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import re
from os import path
pattern = '<<([^>]*)>>'
def user_replace(match):
return raw_input('%s? ' % match.group(1))
def main():
parser = argparse.ArgumentParser()
parser.add_argument('infile', type=argparse.FileType('r'))
parser.add_argument('outfile', type=argparse.FileType('w'))
args = parser.parse_args()
matcher = re.compile(pattern)
for line in args.infile:
new_line = matcher.sub(user_replace, line)
args.outfile.write(new_line)
args.infile.close()
args.outfile.close()
if __name__ == '__main__':
main()
用法:python script.py input.txt output.txt
请注意,此脚本不考虑非ascii文件编码。
答案 4 :(得分:0)
尝试这样的事情
lines = []
with open(myfile, "r") as infile:
lines = infile.readlines()
outlines = []
for line in lines:
index = line.find("<<")
if index > 0:
word = line[index+2:line.find(">>")]
input = raw_input(word+"? ")
outlines.append(line.replace("<<"+word+">>", input))
else:
outlines.append(line)
with open(outfile, "w") as output:
for line in outlines:
outfile.write(line)
免责声明:我实际上并没有这样做,所以它可能不起作用,但它看起来很正确,与我过去所做的相似。
工作原理:
<<
是否存在。如果是,则会删除<<
和>>
括号内的单词,将其用作raw_input
查询的问题。它接受来自该查询的输入,并用输入替换箭头(和箭头)内的值。然后它将此值附加到列表中。如果它没有看到箭头,则只需添加该行。有些问题:
<<firstname>> <<lastname>>
,则会忽略lastname部分。解决这个问题并不难实现 - 您可以使用while
语句放置index > 0
循环并在if语句中保留行。如果你这样做,请记住再次更新索引!编辑:移动+2
以修复损坏的if语句。