Опитвам се да напиша програма на python, която търси определени от потребителя думи в txt файл и копира избраните редове, съдържащи тази дума, в друг файл.
Също така потребителят ще има опция да изключи всяка дума.
(Напр. Да предположим, че потребителят търси думата „изключение“ и иска да изключи думата „abc“, тогава кодът ще копира само редовете, които съдържат „изключение“, но не и „abc“).
Сега цялата работа ще бъде извършена от командния ред.
Входът ще бъде:
file.py test.txt(въведен файл) test_mod.txt(изходен файл) -e abc(изключване на дума, обозначена с -e)-s изключение (търсена дума, обозначена с -s) Сега потребителят ще има опция за въвеждане на множество изключения думи и множество думи за търсене.
Направих програмата с помощта на модула argparse и тя работи. Проблемът ми е, че приема само думи с малки букви като думи за търсене или изключване. Тоест, ако напиша „изключение“ като дума за търсене, тя не намира „Изключение“ или „ИЗКЛЮЧЕНИЕ“. Как да реша този проблем? Искам да игнорирам главни и малки букви както при търсене, така и при изключване на думи. Ето моят код към момента:
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()