Error in python search function - python

I am getting trying to build a search function which searches through text files and prints the search string if the string is found in the text file. If the users second string (quotesearch2) is empty then only the first string is searched and printed (quotesearch1). Why do i keep getting 2 syntax error messages for lines 16 and line 23 (the code checker stoped after line 105 so there may be more after this point).excuse the code, i am only a beginner, I do not want alternative code to complete the function, i just want the errors resolved.
The error is:
SyntaxError: invalid syntax
def search():
import os.path
print "you chose the search option"
validchars = "-.() %s%s" %(string.ascii_letters , string.digits)
thisDir = raw_input("What directory would you like to search ? Not: Any invalid characters will be stripped ") #ask user to choose a directory for multi OS compatibility
thisDir = ''.join(y for y in filesearch if y in validchars)
filesearch = raw_input("What file would you like to search ? Note: Any invalid characters will be stripped: ") #ask user what file they would like t search from
filesearch = ''.join(x for x in filesearch if x in validchars)
fullpath = os.path.join(thisDir, filesearch) #create full path for all operating system compatibility
while os.path.isfile(fullpath) == false: #check if the file doesnt exist, if it doesnt alert the user
print "sorry the file you chose does not exist"
thisDir = pickAFolder
filesearch = raw_input("What file would you like to search ? Note: Any invalid characters will be stripped: ")
filesearch = ''.join(x for x in filesearch if x in validchars) #strip invalid characters
fullpath = os.path.join(thisDir, filesearch)
elif os.path.isfile(fullpath) == true:
f = open(fullpath, 'r') #open file
found = false
linecount = 0
while found == false: # while the found variable is equal to false ask the user what they would like to search
quotesearch1 = raw_input("whats the first string you would you like to search ?: ")
quotesearch2 = raw_input("whats the second string you want to search for ?: "
for line in f: #for each line in the quote file if the quotesearch1 (usersfirst search) is in the line, print it along with a blank line
if quotesearch2 != " " or "":
if quotesearch1 and quotesearch2 in line:
print line
print "\n"
linecount = line + 1 # variable to track the amount of lines printed
elif quotesearch2 == " " or "":
if quotesearch1 in line:
print line
print "\n"
linecount = line + 1
found = true
if linecount == 0 and found == true : # if variable == 0 the quote search was not in the file and if the search was completed
print "sorry the search could not be found" # print the quote search cold not be found
Menu = true
fclose(fullpath)
elif found == true:
print "search complete"

while os.path.isfile(fullpath) == false:
elif os.path.isfile(fullpath) == true:
You use capital F for False in Python and capital T for True
And you are missing a closing ")" on the line quotesearch2 = raw_input("whats the second string you want to search for ?: "
if quotesearch2 != " " or "":
should be if quotesearch2 != " " or quotesearch2 != "":
elif quotesearch2 == " " or "":
should be elif quotesearch2 == " " or quotesearch2 == "":
You are not checking if quotesearch2 is not equal to ""
In [7]: i=10
In [8]: if i == 9 or 4:
print "weird"
...:
weird
In [9]: if i == 9 or i == 4:
print "weird"
...:
In [10]:
You see you the print "weird" gets executed even though i is not equal to 10 but in the second statement when I use or i == 4: it does not.

Related

How to import content from a text file and add them to variables

I have a settings file for a monopoly like game I'm making, the settings file has parameters like the number of people playing and whatnot, I would like to know how to import the settings from that text file and bring it into different variables, for example, having number of players in the settings file go to a numPlayers variable in the actual code so I can use it for other games and also usee the settings in the code
This is my code:
def inputs(line, typeinp=None, start=None, end=None):
while True:
string = input(line)
if typeinp != None:
try:
if typeinp == "string":
string = str(string)
elif typeinp == "integer":
string = int(string)
if start != None and end != None:
while not (string >= start and string <= end):
print("Please input a number between", str(start) + "-" + str(end))
string = int(input(line))
break
except:
print("Plese input a", typeinp)
else:
break
return string
# Settings file, if user chooses to run setup this is all the setup questions
def gameSettingsSetup():
settingsCheck = open("settings.txt", "r")
print("Lets setup")
# Int Setup questions
numPlayers = str(inputs('How many real players are playing: ', "integer"))
numAIplayers = str(inputs('How many AI players will be playing?: ', "integer"))
AILevel = str(inputs("What AI difficulty level would you like? (Easy, Normal, Hard): "))
while True:
if AILevel == "Easy" or AILevel == "Normal" or AILevel == "Hard":
startingMoney = str(inputs("How much money does everyone start with? Max: 10 000 (Keep in mind "
"this does not affect the property prices) ", "integer", 100, 10000))
break
else:
print("Please enter a valid input (make sure to capitalize the first letter)")
AILevel = str(inputs("What AI difficulty level would you like? (Easy, Normal, Hard): "))
# sends over the settings into the text file as well as monoset check
if "MonoSet1-1" in settingsCheck.read():
with open("settings.txt", "w") as file:
file.write("MonoSet1-1: true" + "\n")
file.write("numPlayer: " + numPlayers + "\n")
file.write("numAIplayer: " + numAIplayers + "\n")
file.write("AI Level: " + AILevel + "\n")
file.write("startingMoney: " + startingMoney + "\n")
file.close()
# Allows for access to the settings file and drops values into a list
settings = []
with open("settings.txt") as file:
for line in file:
line = line.split(":")
line = line[1]
line = line.rstrip("\n")
line = line[1:]
line = line.split(" ")
try:
for x in range(len(line)):
line[x] = int(line[x])
line = (line[0], line[1])
except:
line = line[0]
settings.append(line)
file.close()
print("Alright the setup is complete, Your game will start now....")
time.sleep(1)
return settingsCheck, settings

how to write an encryption program in python

I am needing a bit of help on my encryption program. Instead of having the program just move the letters by two (c would become a or r would become p) I'd like to be able to have it reference 2 lists, the first one going from a-z normally and the other with letters in different order to act as the encrypt/decrypt side. Hopefully that makes sense. Here's what i have so far.
result = ''
choice = ''
message = ''
while choice != 0:
choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")
if choice == '1':
message = input('\nEnter message for encryption: ')
for i in range(0, len(message)):
result = result + chr(ord(message[i]) - 2)
print(result + '\n\n')
result = ''
if choice == '2':
message = input('\nEnter message to decrypt: ')
for i in range(0, len(message)):
result = result + chr(ord(message[i]) + 2)
print(result + '\n\n')
result = ''
elif choice != '0':
print('You have entered an invalid input, please try again. \n\n')
This works fine and dandy but i'd like to have the lists. Lets say list 1 is A,B,C,D,E and list 2 would be W,N,U,D,P. just for ease of use purposes.
Here is a solution, for small letters only. It can easily be modified to handle also capital letters, by adding them to the text strings.
As can be seen, the space character is at the same position in both lists. This is not necessary, as any character can be translated to any other. However if the decrypted or encrypted is not containing unique characters only, the program will break down.
decrypted = b"abcdefghijklmnopqrstuvwxyz "
encrypted = b"qwertyuiopasdfghjklzxcvbnm "
encrypt_table = bytes.maketrans(decrypted, encrypted)
decrypt_table = bytes.maketrans(encrypted, decrypted)
result = ''
choice = ''
message = ''
while choice != '0':
choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")
if choice == '1':
message = input('\nEnter message for encryption: ')
result = message.translate(encrypt_table)
print(result + '\n\n')
elif choice == '2':
message = input('\nEnter message to decrypt: ')
result = message.translate(decrypt_table)
print(result + '\n\n')
elif choice != '0':
print('You have entered an invalid input, please try again. \n\n')
Ok, so a few things here...
First I'll give you exactly what you were looking for and explain what I used and some of the changes that needed to be made to your original code. Then I'll explain some inherent issues what what you're trying to do and suggest some areas to read up on/some ways you might want to improve what you've got.
Here's the code you're looking for (while retaining the same flow as what you submitted put above):
import random
result = ''
choice = ''
message = ''
characters_in_order = [chr(x) for x in range(32,127)]
while choice != 0:
choice = input("\n Do you want to encrypt or decrypt the message?\n 1 to encrypt, 2 to decrypt or 0 to exit program. ")
if str(choice) == '1':
message = input('\nEnter message for encryption: ')
r_seed = input('Enter an integer to use as a seed: ')
random.seed(r_seed)
shuffled_list = [chr(x) for x in range(32,127)]
random.shuffle(shuffled_list)
for i in range(0, len(message)):
result += shuffled_list[characters_in_order.index(message[i])]
print(result + '\n\n')
result = ''
elif str(choice) == '2':
message = input('\nEnter message to decrypt: ')
r_seed = input('Enter an integer to use as a seed (should be the same one used to encrypt): ')
random.seed(r_seed)
shuffled_list = [chr(x) for x in range(32,127)]
random.shuffle(shuffled_list)
for i in range(0, len(message)):
result += characters_in_order[shuffled_list.index(message[i])]
print(result + '\n\n')
result = ''
elif str(choice) != '0':
print('You have entered an invalid input, please try again. \n\n')
You'll notice that I set a global 'characters in order' list, which is just every ASCII character (32-126) in order. I also imported the 'random' module and used this to shuffle the characters in order according to a seed that the user inputs. As long as this seed is the same on the encryption and decryption end, it will produce the same shuffled list and it should work to encrypt or decipher the same string. Also notice the str() around your input choices. Without that, the user had to input '1', rather than 1 to submit a choice without an error.
All of that said...
Notice that the way the new function works is by looking at a character's index in one list and pulling out the character at that index in another. The method you were using, of incrementing or decrementing a character's ASCII code is basic (though not much more basic than this), but it also has a pretty critical flaw, which is that characters on one end or another of the ASCII set wouldn't return ASCII characters. If you were encrypting it at a bit-level, which would be preferred, this wouldn't matter/would be irrelevant, but here you're not going to get the kind of string back that you want if you were to, for example, enter a [space] (ASCII 32) into your plaintext to be encrypted.
If you're interested, you might want to read up on symmetric key encryption/DES for some ideas on how encryption is really done, though props on the start/interest and this can certainly be a fun way to create some sort of cryptogram puzzle or something along those lines. I won't pretend to be any kind of expert, but I can at least point you in the write direction. (https://en.wikipedia.org/wiki/Data_Encryption_Standard https://en.wikipedia.org/wiki/Symmetric-key_algorithm)
Consider having your code read in a .txt file and print out to a .txt file, rather than using user input for the message.
Again, I'm not an expert by any means and there are definitely some fun uses of the kind of program you're aiming for, just trying to point you in the right direction if this is something that you're interested in. Hope all of that is helpful!
Here is my solution. It uses a randomizer to encrypt the file by assigning a ASCII value to the plain text and randomly shifts it around.
from random import randint
import sys
def menu():
input1=int(input(""" please select what you want to do:
1.Encrypt
2.Decrypt
3.Extended Encryption
4.exit
"""))#menu to choose what you want to do
if input1==1:
encrypt() #takes you to the encrypt function
elif input1==2:
decrypt()#takes you to the decrypt function
elif input1==3:
enxtended()#takes you to the extended encryption function
elif input1==4:
sys.exit #exits the program
else:
print("invalid entry try again")
menu()
def encrypt():
file_name=str(input("please enter the name of the file that you want to open\n"))
try:
text_file=open(file_name + ".txt","r")#puts the text file into read
text_file=text_file.read()#reads the text file
print(text_file)#prints the strings in the document
except:
print("error try again")
encrypt()
random(text_file)
def random(text_file):
list1=("")#creates blank string
for x in range (0,8):
num=(randint(33,126))#generates a random number between33 and 126
ascii1=chr(num) #converts it into an ascii character
list1=list1+ascii1#adds the ascii character to the blank string list1
print (f"your 8 key code is {list1}") #prints 8 character code
offset(list1,text_file)
def offset(list1,text_file):
total=0
for x in range (8,):
total=total+ord(list1[x]) #turns each character into an ascii value
total=total/8 #divides it by
total=round(total,0)#rounds it to 0 decimel places
print(total)
total=total-32#minuses 32 from total
print(f"your offset factor is {total}")
encrypting(total,text_file)
def encrypting(total,text_file):
length=len(text_file)
string1=("")
for x in range (length,):
numascii=ord(text_file[x])#turns the characters into its ascii value
numascii=int(numascii)#makes sure they are integers
if numascii==32:
letter=chr(32)#converts spaces back into spaces
string1=string1+letter#adds space to thestring
else:
numascii1=numascii+total#adds the character value to the offset factor
numascii1=int(numascii1)#makes sure it is an integer
if numascii1>126:# if the ascii value is great then 126
numascii1=numascii1-94#minus 94 from it
letter=chr(numascii1)#turn it into a character
string1=string1+letter#add it to the string
else:
letter=chr(numascii1)#turn the ascii value into a character
string1=string1+letter#add it to the string
print(f"your encrypted file is {string1}")
savefile(string1)
menu()
I have written separate programs for encryption and decryption. Both of these use file manipulation techniques. Use the username 'eggs' and password 'chicks' so that not anyone can see my secret code. I have used hashlib for more security. Just change the User 'Soumajit' to your respective Username to make it work. The first one is encryption and the next one is for decryption.
#ENCRYPTION
from time import sleep
import subprocess
import hashlib
def copy2clip(txt):
cmd='echo '+txt.strip()+'|clip'
return subprocess.check_call(cmd, shell=True)
def en():
alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!##$%_&* ()`-+=1234567890"
encrypt = ""
decrypt = ""
print
print "Type y for yes and anything else for no"
start = raw_input("Do you want to import file from desktop? ")
if start == "y":
Open = raw_input("Enter the .txt file you want to open in desktop: ")
a = open("C://Users//Soumajit//Desktop//" + Open + ".txt", "r")
print
x = (a.read())
copy2clip(x)
a.close()
print "Right click and select paste below to encrypt"
print
message = raw_input()
for i in message:
x = alphabet.find(i)
new = (x - 5) % 74
encrypt += alphabet[new]
e2 = encrypt[::-1]
else:
print "Type your message below"
message = raw_input("")
for i in message:
x = alphabet.find(i)
new = (x - 5) % 74
encrypt += alphabet[new]
e2 = encrypt[::-1]
print
a = raw_input("By what name do you want to save it?: ")
file = open(a + ".txt", 'wb')
file.write(e2)
file.close()
copy = raw_input("Do you want to copy your file? ")
if copy == 'y':
copy2clip(e2)
print 'Your encrypted file has been copied to the clipboard'
else:
print "Your encrypted file has been saved with the name " + str(a) + " in desktop"
print "To decrypt it, use my other program"
sleep(3)
u = 'e415bf03b4d860dccba57cea46371f831d772ba1deca47f28fa7d1f7'
p = 'c35f7f79dc34a678beb2b4106c84c9963561e7c64bc170e50c429b9a'
ur = raw_input('Enter your username: ')
ur1 = hashlib.sha224(ur).hexdigest()
pr = raw_input('Enter your password: ')
pr1 = hashlib.sha224(pr).hexdigest()
if ur1 == u and pr1 == p:
print 'Access granted'
sleep(1)
en()
else:
print "Incorrect username or password"
sleep(1)
#DECRYPTION
from time import sleep
import subprocess
import hashlib
def copy2clip(txt):
cmd='echo '+txt.strip()+'|clip'
return subprocess.check_call(cmd, shell=True)
def de():
print "Type y for yes and anything else for no"
start = raw_input("Do you want to import file from desktop? ")
if start == "y":
Open = raw_input("Enter the .txt file you want to open from folder: ")
a = open("C://Users//Soumajit//Desktop//" + Open + ".txt", "r")
x = (a.read())
#print x
copy2clip(x)
print "Right click and select paste below to decrypt"
print
message = raw_input()
a.close()
alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!##$%_&*()`-+=1234567890"
decrypt = ''
for i in message:
x = alphabet.find(i)
new = (x + 5) % 74
decrypt += alphabet[new]
d2 = decrypt[::-1]
d3 = d2.replace("`", " ")
final = d3.replace("2", " ")
print
print final
else:
print "Type or paste your encrypted text below"
print
message = raw_input()
alphabet = "abcdefghijklmnopqsrtuwvxyzABCDEFGHIJKLMNOPQSRTUVWXYZ,./?:;!##$%_&*()`-+=1234567890"
decrypt = ''
for i in message:
x = alphabet.find(i)
new = (x + 5) % 74
decrypt += alphabet[new]
d2 = decrypt[::-1]
d3 = d2.replace("`", " ")
final = d3.replace("2", " ")
print
print final
u = 'e415bf03b4d860dccba57cea46371f831d772ba1deca47f28fa7d1f7'
p = 'c35f7f79dc34a678beb2b4106c84c9963561e7c64bc170e50c429b9a'
ur = raw_input('Enter your username: ')
ur1 = hashlib.sha224(ur).hexdigest()
pr = raw_input('Enter your password: ')
pr1 = hashlib.sha224(pr).hexdigest()
if ur1 == u and pr1 == p:
print 'Access granted'
sleep(1)
de()
print
end = raw_input('press q to quit: ')
while end != 'q':
print 'You did not type q'
end = raw_input('press q to quit: ')
if end == 'q':
quit()
else:
print 'Incorrect username or password'
sleep(1)
quit()

Trying to make encryption program which reads and writes to files and encrypts with two keywords. len() function not working

Trying to create an encryption/decryption program in python that reads a message from a file, encrypts with two keywords then outputs to another file. Also, it can do this in reverse.
I'mm having an issue with the len() function:
I get the error: object of type built in function or method has no len() in this section of code:
if (len(line)) == 0:
fileRead = True
In context this is the whole program:
print("Welcome to Python Encrypt 2015")
print("Only enter alphabet charcters into the file - no punctuation!")
#repeat loop for using program again and so on...
finished = False
while not finished:
#input and validation of encrypt/decrypt input
option = input("Do you want to encrypt or decrypt? (E/D): ")
while "E" != option != "D":
option = input("Only input 'E' or 'D'! Do you want to encrypt or decrypt? (E/D): ")
#file to be encrypted/decrypted is opened to read
message = ""
fileRead = False
if option == "E":
file = open("Task3Decrypted.txt","r")
else:
file = open("Task3Encrypted.txt","r")
#message from 'to encrypt' file is read and outputted to variable
while not fileRead:
line = (file.readline()).strip()
if line.isalpha()==True:
line = line.lower
else:
input("Message contains numbers or symbols. Please correct! Press any key to continue: ")
sys.exit
if (len(line)) == 0:
fileRead = True
else:
message = message + line
#file closed - saving it
file.close()
#validating keyword and stretching and cutting to length of message
key1True = False
while key1True == False:
keyword1 = input("Enter your first keyword: ")
if keyword1.isalpha()==True:
keyword1 = keyword1.lower()
key1True = True
key1length = len(keyword1)
while len(keyword1)<len(message):
keyword1=keyword1+keyword1
keyword1=keyword1[:len(message)]
key2True = False
while key2True == False:
keyword2 = input("Enter your second keyword: ")
if keyword2.isalpha()==True:
keyword2 = keyword2.lower()
key2True = True
key2length = len(keyword2)
while len(keyword2)<len(message):
keyword2=keyword2+keyword2
keyword2=keyword2[:len(message)]
newMessage = ""
for i in range(len(message)):
char = ord(message[i])-96
key1 = ord(keyword1[i])-96
key2 = ord(keyword2[i])-96
if char==-64:
newMessage = newMessage+" "
else:
if option == "E":
#clearing original file for security
clearFileE = open("Task3Decrypted.txt","w")
clearFileE.close
#encryption
if char+key1+key2>26:
newMessage = newMessage+chr(char+key1+key2-26+96)
else:
newMessage = newMessage+chr(char+key1+key2+96)
newFile = open("Task3Encrypted.txt","w")
newFile.write(newMessage)
newFile.close()
else:
clearFileD = open("Task3Encrypted.txt","w")
clearFileD.close
#decryption
if char-key1-key2<1:
newMessage = newMessage+chr(char-key1-key2+26+96)
else:
newMessage = newMessage+chr(char-key1-key2+96)
newFile = open("Task3Decrypted.txt","w")
newFile.write(newMessage)
newFile.close()
carryOn = input("Do you want to encrypt/decrypt another message? (Y/N): ")
while "Y" != carryOn != "N":
carryOn = input("Only input 'Y' or 'N'! Do you want to encrypt/decrypt another message? (Y/N): ")
if carryOn == "N":
finished = True
Thanks in advance!
You left off the parentheses in
line = line.lower()
Without the (), you're setting line to the object of the lower() function itself, hence the error message.

Outputting loop data to a text document in python

I currently have the following code: You enter a string, the computer then pulls random letters and tries to match it to the letters in your string. This repeates and with each iteration the computer gets closer to guessing your string. I would like to output the initial string entered or the 'target' and the string format of the number of iterations it took to get the correct match. I want to output this to a text document. So far the script produces a text document but does not output to it. I would like it to save the data after each iteration from the main loop. I have the working program i just need assitance with the output, any ideas on how that could be done?
Here is the progress i made:
import string
import random
possibleCharacters = string.ascii_lowercase + string.digits + string.ascii_uppercase + ' .,!?;:£$^%&*|'
file = open('out.txt', 'w')
again = 'Y'
while again == 'Y' or again == 'y':
target = input("Enter your target text: ")
attemptThis = ''.join(random.choice(possibleCharacters) for i in range(len(target)))
attemptNext = ''
completed = False
generation = 0
while completed == False:
print(attemptThis)
attemptNext = ''
completed = True
for i in range(len(target)):
if attemptThis[i] != target[i]:
completed = False
attemptNext += random.choice(possibleCharacters)
else:
attemptNext += target[i]
generation += 1
attemptThis = attemptNext
genstr = str(generation)
print("Target matched! That took " + genstr + " generation(s)")
file.write(target)
file.write(genstr)
again = input("please enter Y to try again: ")
file.close()
Addressing both the original question and the one in the comments:
How to write to file after each iteration of the loop: call file.flush() after file.write(...) :
file.write(target)
file.write(genstr)
file.flush() # flushes the output buffer to the file
To add a newline after each "target" and "genstring" that you write, well, add a newline to the string (or whatever other output formatting you want) :)
file.write(target + '\n')
file.write(genstr + '\n')

why does my code "break" out of loop?

fileName = raw_input("Enter the filename: ")
n = input("Enter the line you want to look: ")
f = open(fileName,'r')
numbers = []
for line in f:
sentenceInLine = line.split('\n')
for word in sentenceInLine:
if word != '':
numbers.append(word)
print numbers
print len(numbers)
print numbers[n-1]
if n == 0:
print "There is no 0 line"
break
i think you missed to split sentenceInLine like sentenceInLine.split(' ')
You are looping over each line, then you split lines based on '\n'. That \n is a line break character. That would confuse your logic right there.
So it is a bit confusing what you are trying to do but you should check n after the user has inputed a value for n. not at the end.
You may want to also catch the exception where file cannot be found I think this is what you need:
fileName = raw_input("Enter the filename: ")
n = input("Enter the line you want to look: ")
if n == 0:
print "There is no 0 line"
sys.exit();
try:
f = open(fileName,'r')
except IOError:
print "Could not find file"
sys.exit()

Categories