我正在尝试在python中编写一个程序,该程序在txt文件中搜索用户指定的单词,并将包含该单词的选定行复制到另一个文件中。
此外,用户还可以选择排除任何字词。
(例如,假设用户搜索单词“exception”并想要排除单词“abc”,那么代码将只复制其中包含“exception”而不是“abc”的行。
现在所有工作都将从命令提示符完成。
输入将是:
file.py test.txt(输入文件)test_mod.txt(输出文件)-e abc(排除-e表示的单词)-s exception(搜索单词用-s表示)现在用户可以选择输入多个排除词和多个搜索词。
我使用argparse模块完成了程序并运行。 我的问题是当它搜索单词时(包括排除单词和搜索单词),它不考虑spaces.E.g它会在单词“abcexception”中找到单词“exception”。现在有时我需要这个功能,有时候我不需要。这是我现在的代码。
import sys
import os
import argparse
import tempfile
import re
def main(): #main method
try:
parser = argparse.ArgumentParser(description='Copies selected lines from files') #Defining the parser
parser.add_argument('input_file') #Adds the command line arguments to be given
parser.add_argument('output_file')
parser.add_argument('-e',action="append")
parser.add_argument('-s',action="append")
args = parser.parse_args() #Parses the Arguments
user_input1 = (args.e) #takes the word which is to be excluded.
user_input2 = (args.s) #takes the word which is to be included.
def include_exclude(input_file, output_file, exclusion_list=[], inclusion_list=[]): #Function which actually does the file writing and also handles exceptions
if input_file == output_file:
sys.exit("ERROR! Two file names cannot be the same.")
else:
try:
found_s = False #These 3 boolean variables will be used later to handle different exceptions.
found_e = False
found_e1 = True
with open(output_file, 'w') as fo: #opens the output file
with open(input_file, 'r') as fi: #opens the input file
for line in fi: #reads all the line in the input file
if user_input2 != None:
inclusion_words_in_line = map(lambda x: x in line, inclusion_list)#Mapping the inclusion and the exclusion list in a new list in the namespace
if user_input1 != None and user_input2 != None: #This list is defined as a single variable as condition operators cannot be applied to lists
exclusion_words_in_line = map(lambda x: x in line, exclusion_list)
if any(inclusion_words_in_line) and not any(exclusion_words_in_line): #Main argument which includes the search word and excludes the exclusion words
fo.write(line) #writes in the output file
found_s = True
elif user_input1 == None and user_input2 != None: #This portion executes if no exclude word is given,only the search word
if any(inclusion_words_in_line):
fo.write(line)
found_e = True
found_s = True
found_e1 = False
if user_input2 == None and user_input1 != None: #No search word entered
print("No search word entered.")
if not found_s and found_e: #If the search word is not found
print("The search word couldn't be found.")
fo.close()
os.remove(output_file)
elif not found_e and not found_s: #If both are not found
print("\nNOTE: \nCopy error.")
fo.close()
os.remove(output_file)
elif not found_e1: #If only the search word is entered
print("\nNOTE: \nThe exclusion word was not entered! \nWriting only the lines containing search words")
except IOError:
print("IO error or wrong file name.")
fo.close()
os.remove(output_file)
if user_input1 != user_input2 : #this part prevents the output file creation if someone inputs 2 same words creating an anomaly.
include_exclude(args.input_file, args.output_file, user_input1, user_input2);
if user_input1 == user_input2 : #This part prevents the program from running further if both of the words are same
sys.exit('\nERROR!!\nThe word to be excluded and the word to be included cannot be the same.')
except SystemExit as e: #Exception handles sys.exit()
sys.exit(e)
if __name__ == '__main__':
main()
我怎样才能在这个程序中包含两个参数,比如说:-ew和-sw只搜索整个单词,只搜索-e和-s,即使没有空格也会搜索单词?所以总共会有4个参数。( - e,-s,-ew,-sw)
答案 0 :(得分:0)
一种选择是定义-w
参数
parser.add_argument('-w', action='store_true')
这将设置args.w
布尔值。 -we ...
与-w -e ...
相同。 -ew
无效,因为-e
需要参数,而-w
则不会。但是这个args.w
是一个全局转换。
要分别控制每个搜索词,除了--we
和--ws
之外,我还建议使用-e
,-s
等参数名称。理想情况下,单个破折号带有一个字母,双破折号带有更长的名称。或者使用-E
和-S
。无论argparse
是否执行此类规则,您的用户都会欣赏明确的简单规则。在任何情况下,您最终都会得到4个单词列表。
()
中您不需要user_input1 = (args.e)
。 args.e
已经是一个列表,因为操作是append
。另一种方法是nargs='+'
,您可以输入-e word1 word2 -s word3 ...
。使用+
的{{1}}也可能有效,但append
可能是列表列表,您必须将其展平。