如何在文本文件中查找字符串并在Python脚本中使用用户输入替换每次?

时间:2011-06-28 19:35:27

标签: python replace

我是python的新手,请原谅我的无知。

目前,我有一个文本文件,其中一些单词标记为<>。

我的目标是基本上构建一个脚本,该脚本通过带有这些标记单词的文本文件运行。每次脚本找到这样的单词时,它都会询问用户要用它替换它的内容。

例如,如果我有一个文本文件:

Today was a <<feeling>> day.

脚本将运行文本文件,因此输出将为:

Running script...
feeling? great
Script finished.

并生成一个文本文件,其中包含:

Today was a great day.

么?

编辑:感谢您提出的建议!我制作了一个脚本,大部分都像我想要的那样。就一件事。现在我正在研究如果我有多个具有相同名称的变量(例如,“我是&lt;&gt; .Bob也是&lt;&gt;。”)脚本只会提示,感觉?,一次并填写所有具有相同名称的变量。

非常感谢你的帮助。

5 个答案:

答案 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)

打开file并循环播放:

使用raw_input从用户

获取输入

现在,把它放在一起,如果遇到问题,请更新问题: - )

答案 2 :(得分:1)

我知道您需要有关如何构建脚本的建议,对吧?这就是我要做的事情:

  1. 立即读取文件并关闭它(我个人不喜欢打开文件对象,特别是如果我的文件系统是远程的)。
  2. 使用正则表达式(phihag在his answer中建议了一个,所以我不再重复)以匹配占位符的模式。找到占位符的所有,并将其作为键存储在字典中。
  3. 对于字典中的每个字词,询问用户raw_input (而不仅仅是input)。并将它们存储为字典中的值。
  4. 完成后,使用用户词(值)解析您的文本替换给定占位符(键)的任何实例。这也是使用regex完成的。
  5. 使用字典的原因是给定的占位符可能会出现多次,您可能不希望让用户一遍又一遍地重复输入...

答案 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查询的问题。它接受来自该查询的输入,并用输入替换箭头(和箭头)内的值。然后它将此值附加到列表中。如果它没有看到箭头,则只需添加该行。
  • 在遍历所有行之后,它将它们写入输出文件。你可以制作任何你想要的文件。

有些问题:

  1. 如上所述,这将仅适用于每行一个箭头语句。因此,如果您在同一行上有<<firstname>> <<lastname>>,则会忽略lastname部分。解决这个问题并不难实现 - 您可以使用while语句放置index > 0循环并在if语句中保留行。如果你这样做,请记住再次更新索引!
  2. 它遍历列表三次。你可能会把它减少到两个,但如果你有一个小的文本文件,这应该不是一个大问题。
  3. 它可能对编码很敏感 - 但我并不完全确定。在最糟糕的情况下,你需要把它作为一个字符串。
  4. 编辑:移动+2以修复损坏的if语句。