A permanent list change(Save python file) - python-3.x

I am a noob in python and i need help.I have made a phonebook where you can add the contacts.But the problem is that when i exit the program the changes to the list are not saved.I want the user to be able to make permanent changes to the list.I have seen posts about a file=open("something",'w') code to do this(I think) but i dont know where to insert this code and i dont really understand what it is.Could someone help me understand what this is about..Here is the full code:
name = ["ranga","hari"]
number = [9895497777,9]
book = {name[0]:number[0],name[1]:number[1]}
def search():
print("Contacts:")
for x in book:
print(x,':',book[x])
while 1:
count = 0
a = 0
ch1 = input("search: ")
try:
ch1 = int(ch1)
except ValueError:
while a < len(name):
result = name[a].find(ch1)
if result == -1:
a = a + 1
else:
print(name[a],number[a])
a = a + 1
count = count + 1
if count == 0:
print("Not available.Try again")
continue
else:
break
ch1 = str(ch1)
while a < len(number):
sumber = str(number[a])
result = sumber.find(ch1)
if result == -1:
a = a + 1
else:
print(name[a],number[a])
a = a + 1
count += 1
if count == 0:
print("Not available.try again")
continue
else:
break
def add():
print("What is the name of the contact you want to add?")
name1 = input()
name.append(name1)
while 1:
print("What is the number of this contact?")
number1 = input()
try:
number1 = int(number1)
except ValueError:
print("Please type a number..")
continue
number.append(number1)
book[name1] = number1
break
def remoe():
print("Reference:")
for x in book:
print(x,':',book[x])
while 1:
print("What is the name of the contact you want to remove?")
name2 = input()
if name2 in book:
increment = name.index(name2)
name.pop(increment)
number.pop(increment)
del book[name2]
break
else:
print("Not available.Please try again")
while 1:
print("Contacts:")
for x in book:
print(x, ':', book[x])
print("\nWhat do you want to do?\n1.Search for a person\n2.edit the phone book\n3.exit")
choice = input()
try:
choice = int(choice)
except ValueError:
print("Type 1,2 or 3")
continue
if choice == 1:
search()
elif choice == 2:
while 1:
print("Do you want to:\n1.Add a contact\n2.Remove a contact\n3.Go back to main menu")
ch2 = input()
if ch2 in['3']:
break
else:
try:
ch2 = int(ch2)
except ValueError:
print("Type 1 or 2..")
if ch2 == 1:
add()
elif ch2 == 2:
remoe()
elif choice == 3:
exit()
else:
print("Type 1,2 or 3")
I appreciate the help.

When you choose to add a contact, it does properly add the name and number to the list. But, that is it.
When you re-run the program, the list gets re-assigned due to the first 2 lines of your code:
name = ["ranga","hari"]
number = [9895497777,9]
So, you won't see the last changes.
This is where you should maintain a file which lives outside the scope of your code, rather than a list.
You can modify your add function like this:
def add():
print("What is the name of the contact you want to add?")
name1 = input()
#name.append(name1)
# Just add the name1 variable's value to the file
with open('contacts_list.txt', 'a+') as f:
f.write(name1 + '\n')
while 1:
print("What is the number of this contact?")
number1 = input()
try:
number1 = int(number1)
except ValueError:
print("Please type a number..")
continue
#number.append(number1)
# Similarly, append the number1 variable's value to file again.
with open('contacts_list.txt', 'w+') as f:
f.write(number1)
#book[name1] = number1
with open('contacts_list.txt', 'r') as f:
print(f.read())
break
Note: You would also need to change the other functions search and remove to read and write from the file. I've just given you a taste of how things are done. You need to modify your code and make it work.
Let me know if it helps.

I took your advice and made a new text file but i still did not know how to do it but after reading ur answers i understood and at last i came to this..
removelist = []
def search():
while 1:
search = str(input("Search: "))
if search not in["exit", "Exit"]:
with open('output.txt', 'r+') as f:
line = f.readline()
while line:
data = line.find(search)
if not data == -1:
print(line.rstrip('\n'))
line = f.readline()
else:
line = f.readline()
else:
break
f.close()
def add():
print("Type the name of the contact:")
name = input()
while 1:
print("Type the number of this contact:")
number = input()
try:
number = int(number)
except ValueError:
print("Please type a number")
continue
number = str(number)
with open('output.txt', 'a+') as f:
f.write('\n' + name +' ' + number)
break
def remoe(): #this is where the problem comes in
while 1:
remove = str(input("Remove: "))
with open('output.txt', 'r+') as f:
line = f.readline()
while line:
if not remove in["Remove", "remove"]:
removelist.clear()
data = line.find(remove)
if not data == -1:
removelist.append(line) #This saves all the lines coming from the search to a
print(removelist) #removelist which can be accessed when you type in remove
line = f.readline() #But the problem is that if there is a \n at the end of the
else: #string then the remove function does not work
line = f.readline()
else:
print(removelist)
with open('output.txt', 'r') as f:
d = f.readlines()
f.close()
with open('output.txt', 'w') as f:
for i in d:
if i not in removelist:
f.write(i)
f.truncate()
f.close()
break
while 1:
with open('output.txt', 'r') as f:
data = f.read()
print("Contacts:")
print(data)
print('''What do you want to do?
1.Search for a contact
2.Edit contacts
3.Exit''')
f.close()
choice = input()
if choice in["1"]:
search()
elif choice in["2"]:
while 1:
print('''What do you wanna do:
1.Add a contact
2.Remove a contact
3.Exit to main menu''')
ch1 = input()
if ch1 in["1"]:
add()
elif ch1 in["2"]:
remoe()
elif ch1 in["3"]:
break
else:
print("Please type 1,2 or 3")
elif choice in[3]:
print("Ok bye")
else:
print("Please type 1,2 or 3")
Now the problem seems to be the remove function..if i try to remove a line with \n at the end of it then it wont work while the opp. seems to work.Any guess what i am doing here?
And thanks for the help Mayank porwal

At the first you should know name = ["ranga","hari"], number = [9895497777,9] that you have defined are in the code and you can not change those value, and after exit() they will reset to default value.
you should use of file (for example .txt file) in this issue:
1. you must create a .txt file in your project (for example Contacts.txt)
2. and write your information in there (for example in first line: Kourosh +98938....)
3. at the first step in your program you must read Contact.txt and load it in a structure like a list or dictionary (for example
>>> with open('workfile') as f:
... read_data = f.read()
>>> f.closed
)
4.now you can edit, add, remove structure.
5.and finally you can write structure in the file, before exit()
for example:
>>> with open('workfile') as f:
... f.write(s)
>>> f.closed

Related

Expanding the output to the top 5 email addresses (from the top 1) in Python script

my last homework assignment is writing a script that finds the 5 most common email addresses in a text file (linked on hastebin below). I've found a way to find the single most common email address, but how can I expand this output to the top 5? Any help would be greatly appreciated.
while True:
try:
filename = input("Enter a file name: ")
fhand = open(filename, 'r')
email_addresses = {}
for line in fhand:
if line.startswith("From "):
email = line.split()[1]
email_addresses[email] = email_addresses.get(email, 0) + 1
max_address = None
max_emails = 0
for k in email_addresses:
if email_addresses[k] > max_emails:
max_address = k
max_emails = email_addresses[k]
print(max_address, max_emails)
print(email_addresses, email)
ans = input('Do you want to try another file?: (y/n): ')
ans = ans.lower()
if ans == 'y':
continue
if ans == 'n':
print('Thanks for playing!')
break
else:
continue
except:
print('File name',fname,'does not exist.')
continue
And the text file: https://hastebin.com/egixurubak.makefile
A quick idea:
Find the single most common email address in email_addresses, remove it from the dict, store it in a list, find the next single most common email address....

How to write a python code to append data to json list

I want to create a python script which will have user input to enter a word and its definitions (multiple definitions) and append them to a JSON file
For some word there will be only one definition but others might have multiple ones.
JSON Example:
{'acid': ['A compound capable of transferring a hydrogen ion in solution.',
'Being harsh or corrosive in tone.',
'Having an acid, sharp or tangy taste.',
'A powerful hallucinogenic drug manufactured from lysergic acid.',
'Having a pH less than 7, or being sour, or having the strength to '
'neutralize alkalis, or turning a litmus paper red.'],
'acoustic filter': ['A device employed to reject sound in a particular range '
'of frequencies while passing sound in another range of '
'frequencies.'],
'acoustic insulation': ['The process of preventing the transmission of sound '
'by surrounding with a nonconducting material.']}
Code:
import json
while True:
Word = input('Enter Word:')
Definition1 = input('Definition 1: ')
Definition2 = input('Definition 2: ')
Definition3 = input('Definition 3: ')
Definition4 = input('Definition 4: ')
Definition5 = input('Definition 5: ')
Definition6 = input('Definition 6: ')
with open("files/data.json", "r+") as data:
information = {Word, Definition1, Definition2, Definition3, Definition4, Definition5}
data.write(json.dumps(information))
data.close()
I would advice the structure like this:
import json
words_dict = {}
while True:
tmp_list_of_definitions = []
word = input('Enter Word:')
if word in words_dict:
print('You already entered definitions for such word!')
answer = input('Is the procedure over? [y/n]')
if answer == 'y':
break
continue
def_counter = 0
print('In case you want to stop entering the definitions print "stop"')
while True:
definition = input('Definition {}: '.format(def_counter))
def_counter += 1
if definition == 'stop':
break
tmp_list_of_definitions.append(definition)
words_dict[word] = tmp_list_of_definitions
answer = input('Is the procedure over? [y/n]')
if answer == 'y':
break
And you don't have to use close when using with open().
Hope this helps,
import json
if __name__ == '__main__':
information = dict()
while True:
key = input("Enter word or 'q' to quit:")
if key is 'q':
break
definition_list = list()
while True:
definition = input("Enter definition or 'n' to next word:")
if definition is 'n':
break
definition_list.append(definition)
information[key] = definition_list
with open("data.json", "r+") as data:
data.write(json.dumps(information))
exit(0)

Simple Python File I/O spell check program

For a class I have to create a simple spell checking program that takes two files as inputs, one containing correctly spelled words and one containing a paragraph with a few misspelled words. I thought I had it figured out but I am getting an error I have never seen before. When the program finishes it gives the error:
<function check_words at 0x7f99ba6c60d0>
I have never seen this nor do I know what it means, any help in getting this program working would be appreciated. Program code is below:
import os
def main():
while True:
dpath = input("Please enter the path to your dictionary:")
fpath = input("Please enter the path to the file to spell check:")
d = os.path.isfile(dpath)
f = os.path.isfile(fpath)
if d == True and f == True:
check_words(dpath, fpath)
break
print("The following words were misspelled:")
print(check_words)
def linecheck(word, dlist):
if word in dlist:
return None
else:
return word
def check_words(dictionary, file_to_check):
d = dictionary
f = file_to_check
dlist = {}
wrong = []
with open(d, 'r') as c:
for line in c:
(key) = line.strip()
dlist[key] = ''
with open(f, 'r') as i:
for line in i:
line = line.strip()
fun = linecheck(line, dlist)
if fun is not None:
wrong.append(fun)
return wrong
if __name__ == '__main__':
main()
It's not an error, it's doing exactly what you are telling it to.
This line:
print(check_words)
You are telling it to print a function. The output you are seeing is just Python printing the name of the function and it's address: "printing the function".
Yes, don't do print(check_words), do print(check_words())
Furthermore, change check_words(dpath, fpath) to misspelled_words = check_words(dpath, fpath)
And change print(check_words) to print(misspelled_words)
Final code (with a few modifications):
import os
def main():
while True:
dpath = input("Please enter the path to your dictionary: ")
fpath = input("Please enter the path to the file to spell check: ")
d = os.path.isfile(dpath)
f = os.path.isfile(fpath)
if d == True and f == True:
misspelled_words = check_words(dpath, fpath)
break
print("\nThe following words were misspelled:\n----------")
#print(misspelled_words) #comment out this line if you are using the code below
#optional, if you want a better looking output
for word in misspelled_words: # erase these lines if you don't want to use them
print(word) # erase these lines if you don't want to use them
#------------------------
def linecheck(word, dlist):
if word in dlist:
return None
else:
return word
def check_words(dictionary, file_to_check):
d = dictionary
f = file_to_check
dlist = {}
wrong = []
with open(d, 'r') as c:
for line in c:
(key) = line.strip()
dlist[key] = ''
with open(f, 'r') as i:
for line in i:
line = line.strip()
fun = linecheck(line, dlist)
if fun is not None:
wrong.append(fun)
return wrong
if __name__ == '__main__':
main()

How to delete a specific line in a text file using user input Python 3

I have a problem with a python 3 program. I am trying to build a function that delets a specific line in a text file using user input but can't for the life of me get it to work. Since I am a beginner i was wondering if someone more expicienced could help me with buildning the function.
Python 3 code:
def main():
players = load_results_from_file("user_res.txt")
while True:
show_menu()
user_choice = input("Välj alternativ: ")
print()
if user_choice == "1":
show_players(players)
elif user_choice == "2":
add_player(players)
elif user_choice == "3":
save_players(players, "user_res.txt")
elif user_choice == "4":
del_player(players)
elif user_choice == "5":
break
else:
print("Du angav ett felaktivt val, försök igen")
print("Ha en bra dag!")
def save_players(players, file_name):
my_file = open(file_name, "w")
for player in players:
my_file.write("{};{};{};{}\n".format(player["name"],
player["round_1"],
player["round_2"], player["round_3"]))
my_file.close()
print("Sparat!")
def add_player(players):
name = input("Ange namn: ")
round_1 = input("Ange varv 1: ")
round_2 = input("Ange varv 2: ")
round_3 = input("Ange varv 3: ")
players.append({
"name": name,
"round_1": round_1,
"round_2": round_2,
"round_3": round_3
})
def show_players(players):
print("*"*40)
print("Mini Golf")
print("*"*40)
for player in players:
print("{:15} {} {} {}".format(player["name"], player["round_1"],
player["round_2"], player["round_3"]))
print()
def show_menu():
print("Klubbmästerskap i minigolf")
print("*"*40)
print()
print("Meny")
print("*"*4)
print("1) Visa resultat")
print("2) Lägg till resultat")
print("3) Spara resultat")
print("4) Radera spelare")
print("5) Avsluta programmet")
def load_results_from_file(file_name):
players_list = []
try:
my_file = open(file_name, "r")
except:
my_file = open(file_name, "w").close()
print("INFO: Ingen fil hittades, så vi skapa den!")
return players_list
content = my_file.read()
for players in content.split("\n"):
try:
player = players.split(";")
players_list.append({
"name": player[0],
"round_1": player[1],
"round_2": player[1],
"round_3": player[1]
})
except:
pass
return players_list
def del_player(players):
delete_player = input("Ange spelaren du vill radera: ")
my_file = open("user_res.txt", "r")
lines = my_file.readlines()
my_file.close()
my_file = open("user_res.txt", "w")
for line in lines:
if delete_player not in lines:
my_file.write(line)
main()
Some of the text is in swedish and I will change that if it is necessary. But the function that I can't get to work is del_player. I want the user to input the player they want to delete with delete_player but so far it don't delete anything from the text file.
The problem is for sure a small TYPO marked in the source code with '#(1) !!!':
def del_player(players):
delete_player = input("Ange spelaren du vill radera: ")
my_file = open("user_res.txt", "r")
lines = my_file.readlines()
my_file.close()
my_file = open("user_res.txt", "w")
for line in lines:
print(type(delete_player), delete_player, type(line), line) #(2) !!!
if delete_player not in line: #(1) !!!
my_file.write(line)
If this doesn't solve the problem adding a print() (marked #(2) !!! as above can clarify how it comes that delete_player is not found in line.

Ignoring quotes while sorting lists in Python?

I am making a program to read from a file, alphabetize the info, and paste it into an output.. The only issue I am having is in the information that begins with quotes ("").
The main function for the program is to auto-sort MLA works cited pages (for fun obviously).
Here is the code... I would love any criticism, suggestions, opinions (Please keep in mind this is my first functioning program)
TL;DR -- How to ignore " 's and still alphabetize the data based on the next characters..
Code:
import os, sys
#List for text
mainlist = []
manlist = []
#Definitions
def fileread():
with open("input.txt", "r+") as f:
for newline in f:
str = newline.replace('\n', '')
#print(str)
manlist.append(str)
mansort(manlist)
#print("Debug")
#print(manlist)
def main():
print("Input Data(Type 'Done' When Complete or Type 'Manual' For file-read):")
x = input()
if x.lower() == 'done':
sort(mainlist)
elif x == '':
print("You must type something!")
main()
elif x.lower() == 'manual':
fileread()
else:
mainlist.append(x)
main()
def mansort(manlist):
print("What would you like to name the file?(Exit to Terminate):")
filename = input()
manlist = sorted(manlist, key=str.lower)
for s in manlist:
finalstring2 = '\n'.join(str(manlist) for manlist in manlist)
if filename == '':
print("You must choose a name!")
elif filename.lower() == 'exit':
sys.exit()
else:
with open(filename + ".txt", "w+") as f:
f.write(str(finalstring2))
def sort(mainlist):
os.system("cls")
mainlist = sorted(mainlist, key=str.lower)
for s in mainlist:
finalstring = '\n'.join(str(mainlist) for mainlist in mainlist)
print(finalstring)
print("What would you like to name the file?(Exit to Terminate):")
filename = input()
if filename.lower() == 'exit':
sys.exit()
elif filename == '':
print("You must type something!")
sort(mainlist)
else:
with open(filename + ".txt", "w+") as f:
f.write(str(finalstring))
print("\nPress Enter To Terminate.")
c = input()
main()
#Clears to prevent spam.
os.system("cls")
Please keep all criticism constructive... Also, just as an example, I want "beta" to come after alpha, but with my current program, it will come first due to "" 's
sorted(mainlist, key=str.lower)
You've already figured out that you can perform some transformation on each item on mainlist, and sort by that "mapped" value. This technique is sometimes known as a Schwartzian Transform.
Just go one step further - remove the quotes and convert it to lower case.
sorted(mainlist, key=lambda s: s.strip('"').lower())

Resources