-1

我会回答我能回答的任何问题

基本上我有一个包含 70 个单词的列表,我在 500 多个文件中查找,我需要用新单词和数字替换它们。

即...找到“hello”并替换为“hello 233.4”,但有 70 个单词/数字和 500 多个文件。

我在这里找到了一篇内容丰富的帖子,但我一直在阅读有关 sys.argv、re、搜索、替换等的内容。等等。我无法理解这段代码。我一直在用 scriptname.py“-i”和“-o”从 Windows 7 上的“cmd”窗口“调用”(我认为)它...

如果有人可以将示例输入搜索列表路径“c:/input/file/path/searchlist.txt”和要搜索的文件的示例路径“c:/search/this/file/searchme.txt”放在正确的位置请职位!(我会尝试让它自己重复文件夹中的每个文件,并自己突出显示或加粗替换。)

我尝试了很多组合...我可以检查我所做的每一个修改,并且可以输入天/页/天/页...每天/页面每次都变得越来越笨!

谢谢...或者如果您知道不同的方法,请提出建议。

这是原始帖子的链接:

使用 Python 在一个 .txt 文件中搜索单词或短语列表(并显示上下文)

这是原始帖子中的代码:

import re
import sys

def main():
  if len(sys.argv) != 3:
    print("Usage: %s fileofstufftofind filetofinditin" % sys.argv[0])
    sys.exit(1)

  with open(sys.argv[1]) as f:
    patterns = [r'\b%s\b' % re.escape(s.strip()) for s in f]
  there = re.compile('|'.join(patterns))

  with open(sys.argv[2]) as f:
    for i, s in enumerate(f):
      if there.search(s):
        print("Line %s: %r" % (i, s))

main()
4

2 回答 2

1

您在上面发布的代码对于您的任务所需的内容可能很复杂。也许像下面这样更简单的东西更容易理解:

# example variables
word_mapping = [['horse', 'donkey'], ['left', 'right']]
filename = 'C:/search/this/file/searchme.txt'

# load the text from the file with 'r' for "reading"
file = open(filename, 'r')
text = file.read()
file.close()

# replace words in the text
for find_word, replacement in word_mapping:
    text = text.replace(find_word, replacement)

# save the modified text to the file, 'w' for "writing"
file = open(filename, 'w')
file.write(text)
file.close()

要加载要替换的单词列表,您可以简单地执行以下操作:

words_path = 'C:/input/file/path/searchlist.txt'
with open(words_path) as f:
    word_mapping = [line.split() for line in f]

str.split()默认情况下在空格(空格、制表符)上拆分字符串,但您可以在其他字符甚至“单词”上拆分。例如,如果您有一个逗号分隔的文件,您使用line.split(',')它并以逗号分隔。


作为对您在上面发布的代码的解释.. 发生了几件不同的事情,所以让我们把它分解成几部分。

if len(sys.argv) != 3:
    print("Usage: %s fileofstufftofind filetofinditin" % sys.argv[0])
    sys.exit(1)

此特定脚本接收单词列表和目标文件的路径作为命令行参数,因此您可以将此脚本作为python script_name.py wordslist_file target_file. 换句话说,您不会在脚本中硬编码文件路径,而是让用户在运行时提供它们。

代码的第一部分通过检查 的长度来检查有多少命令行参数已传递给脚本,该长度sys.argv是一个包含命令行参数作为字符串的列表。当命令行参数的个数不等于 3 时,会打印错误消息。第一个(或第零个)参数是脚本的文件名,所以这就是为什么sys.argv[0]打印为错误消息的一部分。

with open(sys.argv[1]) as f:
    patterns = [r'\b%s\b' % re.escape(s.strip()) for s in f]
    there = re.compile('|'.join(patterns))

这将打开一个包含单词的文件(文件名等于sys.argv[1])并为它们编译正则表达式对象。正则表达式使您可以更好地控制匹配的单词,但它有自己的“迷你语言”,如果您没有使用它的经验,可能会很混乱。请注意,此脚本仅查找单词而不替换它们,因此包含它使用的单词的文件每行仅包含一个“单词”。

with open(sys.argv[2]) as f:
    for i, s in enumerate(f):
        if there.search(s):
            print("Line %s: %r" % (i, s))

这将打开目标文件(第二个命令行参数中的文件名sys.argv[2]并循环遍历该文件中的行。如果一行包含单词列表中的单词,则打印整行。

于 2013-10-29T19:48:29.280 回答
0

也许可以试试这个...... 在Python中查找扩展名为.txt的目录中的所有文件

将所有 500 个文件放在同一目录中并从那里处理。

于 2013-10-26T01:32:43.617 回答